fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. template<typename T>
  5. class CAutoVar
  6. {
  7. public:
  8. template<typename TVar>
  9. class var
  10. {
  11. public:
  12. var(CAutoVar<TVar> &handler, TVar &var) : m_Handler(handler), m_Var(var) {};
  13. ~var()
  14. {
  15. m_Handler.check();
  16. }
  17. operator TVar&() { return m_Var; }
  18.  
  19. private:
  20. TVar &m_Var;
  21. CAutoVar<TVar> &m_Handler;
  22. };
  23.  
  24. typedef var<T> var_type;
  25.  
  26. CAutoVar(T rhs = T());
  27. operator var_type();
  28. T& operator=(T &rhs);
  29.  
  30. private:
  31. void check();
  32.  
  33. private:
  34. T m_Var;
  35. };
  36.  
  37. template<typename T>
  38. void CAutoVar<T>::check()
  39. {
  40. printf("checked %d\n", m_Var);
  41. }
  42.  
  43. template<typename T>
  44. CAutoVar<T>::CAutoVar(T rhs)
  45. : m_Var(rhs)
  46. {
  47. }
  48.  
  49. template<typename T>
  50. CAutoVar<T>::operator var_type()
  51. {
  52. return var_type(*this, m_Var);
  53. }
  54.  
  55. template<typename T>
  56. T &CAutoVar<T>::operator=(T &rhs)
  57. {
  58. m_Var = rhs;
  59. return m_Var;
  60. }
  61.  
  62.  
  63. int main()
  64. {
  65. CAutoVar<int> n;
  66. printf("%d\n", n); // 0
  67.  
  68. static_cast<CAutoVar<int>::var_type>(n) += 10;
  69. printf("%d\n", n); // 10
  70.  
  71. return 0;
  72. }
  73.  
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
0
checked 10
10