fork download
  1. #include <iostream>
  2.  
  3. union Union
  4. {
  5. char c;
  6. short s;
  7. int i;
  8. float f;
  9. double d;
  10.  
  11. operator char() const { std::cout << "getting char\n"; return c; }
  12. operator short() const { std::cout << "getting short\n"; return s; }
  13. operator int() const { std::cout << "getting int\n"; return i; }
  14. operator float() const { std::cout << "getting float\n"; return f; }
  15. operator double() const { std::cout << "getting double\n"; return d; }
  16. template <typename T> operator T() const { std::cout << "error\n"; T t; return t; }
  17.  
  18. Union &operator =(char ac) { c = ac; std::cout << "set char\n"; return *this; }
  19. Union &operator =(short as) { s = as; std::cout << "set short\n"; return *this; }
  20. Union &operator =(int ai) { i = ai; std::cout << "set int\n"; return *this; }
  21. Union &operator =(float af) { f = af; std::cout << "set float\n"; return *this; }
  22. Union &operator =(double ad) { d = ad; std::cout << "set double\n"; return *this; }
  23. template <typename T> Union &operator =(T at) { std::cout << "error!\n"; return *this; }
  24. };
  25.  
  26. template <typename T>
  27. void doSomething(Union a, const Union b)
  28. {
  29. a = static_cast<T>(b);
  30. }
  31.  
  32. int main(int argc, char **argv)
  33. {
  34. Union a, b;
  35.  
  36. doSomething<int>(a, b);
  37. doSomething<char>(a, b);
  38. doSomething<char *>(a, b);
  39.  
  40. return 0;
  41. }
  42.  
Success #stdin #stdout 0.02s 2724KB
stdin
Standard input is empty
stdout
getting int
set int
getting char
set char
error
error!