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 ?
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.