- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
// implicit_cast< >
// I believe this was originally going to be in the C++ standard but
// was left out by accident. It's even milder than static_cast.
// I use it instead of static_cast<> to emphasize that I'm not doing
// anything nasty.
// Usage is identical to static_cast<>
template <class OutputClass, class InputClass>
inline OutputClass implicit_cast(InputClass input){
return input;
}
// horrible_cast< >
// This is truly evil. It completely subverts C++'s type system, allowing you
// to cast from any class to any other class. Technically, using a union
// to perform the cast is undefined behaviour (even in C). But we can see if
// it is OK by checking that the union is the same size as each of its members.
// horrible_cast<> should only be used for compiler-specific workarounds.
// Usage is identical to reinterpret_cast<>.
// This union is declared outside the horrible_cast because BCC 5.5.1
// can't inline a function with a nested class, and gives a warning.
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;
// Cause a compile-time error if in, out and u are not the same size.
// If the compile fails here, it means the compiler has peculiar
// unions which would prevent the cast from working.
typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u)
&& sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1];
u.in = input;
return u.out;
}
Боль и страдание шаблонного программирования на С++98. Комменты и названия доставляют.
Antervis 11.03.2016 13:33 # +6
guest 11.03.2016 17:18 # +4
Dummy00001 12.03.2016 01:06 # 0
bormand 12.03.2016 07:45 # +1
kegdan 12.03.2016 08:05 # 0
bormand 12.03.2016 08:07 # 0
Soul_re@ver 11.03.2016 15:50 # +5
Dummy00001 12.03.2016 01:07 # +2
TarasB 12.03.2016 00:17 # 0
3.14159265 12.03.2016 01:16 # +3
Дали достаточно веревки чтобы выстрелить в ногу - люди недовольны. Не дали - тоже недовольны. Во всяких жабах через unsafe тоже можно unionы эмулировать и натворить делов.
Antervis 14.03.2016 06:56 # +5
3.14159265 14.03.2016 10:59 # +4
У тебя есть пистолет и голова. О чём ты первым делом подумаешь?
Soul_re@ver 14.03.2016 14:11 # +1
kegdan 14.03.2016 14:36 # +4
Soul_re@ver 14.03.2016 23:35 # 0
kegdan 14.03.2016 23:54 # 0
Тяжесть - это хорошо. Тяжесть - это надежно. Даже если не выстрелит, таким всегда можно врезать по башке.
LispGovno 14.03.2016 09:10 # 0
Запости реализацию этого всего