Search code examples
c++castingunions

Implementation of C++ Cast


I was going through some code in CodeProject and came across the following code for C++ casting.

template <class OutputClass, class InputClass>
union horrible_union{
    OutputClass out;
    InputClass in;
};
template <class OutputClass, class InputClass>
inline OutputClass horrible_cast(const InputClass input){
    horrible_union<OutputClass, InputClass> u;
    u.in = input;
    return u.out;
}

Why is the cast implemented the above way. Why can't we just do a manual cast. Can someone give an example of when a normal cast wouldn't work ?


Solution

  • This approach basically lets you get away with any cast, although it relies on undefined behavior.

    A normal cast would complain when casting between unrelated types, whereas this wouldn't.

    struct A{};
    struct B{};
    
    template <class OutputClass, class InputClass>
    union horrible_union{
        OutputClass out;
        InputClass in;
    };
    template <class OutputClass, class InputClass>
    inline OutputClass horrible_cast(const InputClass input){
        horrible_union<OutputClass, InputClass> u;
        u.in = input;
        return u.out;
    }
    
    int main()
    {
        A a;
        B b;
        a = horrible_cast<A,B>(b);   //this compiles
        a = reinterpret_cast<A>(b);  //this doesn't
    } 
    

    Bottom line: it's horrible, don't do it.