Przechodziłem przez jakiś kod w CodeProject i natrafiłem na następujący kod do odlewania w C++.Implementacja języka C++ Cast
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;
}
Dlaczego obsada została zaimplementowana w powyższy sposób. Dlaczego nie możemy po prostu wykonać rzutowania ręcznego? Czy ktoś może podać przykład, kiedy normalny rzut nie zadziała?
Uzyskanie dostępu do członka związku po ustawieniu innego członka jest niezdefiniowanym zachowaniem, więc wszystko jest lepsze niż to podejście "koszmarnego". –
Prawdopodobnie dlatego nazwano ją okropną obsadą. Ma to na celu zaimplementowanie zachowania specyficznego dla kompilatora. – KodeWarrior