给 C++ 类加上 property,the Simplest way

本文介绍了一种使用模板元编程在C++中实现属性(property)的方法,该方法支持不同类型的读写权限,并通过示例展示了如何在类中使用这些属性。

看了几个给 C++ 添加 property 的实现,觉得都挺麻烦,现在自己造个

  1. template<class T>
  2. struct TypeTraits
  3. {
  4.     typedef T       value_type;
  5.     typedef T       &reference;
  6.     typedef T const &const_reference;
  7.     typedef T       *pointer;
  8.     typedef T const *const_pointer;
  9. };
  10. typedef enum {paReadWrite, paRead, paWrite} PropertyAccessRight;
  11. template <class T, PropertyAccessRight = paReadWrite> 
  12. class Property
  13. {
  14. public:
  15.     typedef typename TypeTraits<T>::value_type          value_type;
  16.     typedef typename TypeTraits<T>::reference           reference;
  17.     typedef typename TypeTraits<T>::const_reference     const_reference;
  18. public:
  19.     Property():val_(value_type()) {};
  20.     Property(const_reference pval):val_(pval) {}
  21.     operator reference()
  22.     {
  23.         return val_;
  24.     }
  25.     operator const_reference() const
  26.     { 
  27.         return val_; 
  28.     }
  29.     reference operator = (const_reference rhs)
  30.     {
  31.         return (val_ = rhs);
  32.     }
  33. private:
  34.     value_type val_;
  35. };
  36. template <class T> 
  37. class Property<T, paRead>
  38. {
  39. public:
  40.     typedef typename TypeTraits<T>::value_type          value_type;
  41.     typedef typename TypeTraits<T>::reference           reference;
  42.     typedef typename TypeTraits<T>::const_reference     const_reference;
  43. public:
  44.     Property():val_(value_type()) {};
  45.     explicit Property(const_reference pval):val_(pval) {}
  46.     operator const_reference() const
  47.     { 
  48.         return val_; 
  49.     }
  50. private:
  51.     value_type val_;
  52. };
  53. template <class T>
  54. class Property<T, paWrite> 
  55. {
  56. public:
  57.     typedef typename TypeTraits<T>::value_type          value_type;
  58.     typedef typename TypeTraits<T>::reference           reference;
  59.     typedef typename TypeTraits<T>::const_reference     const_reference;
  60. public:
  61.     Property():val_(value_type()) {};
  62.     Property(const_reference pval):val_(pval) {}
  63.     void operator = (const_reference rhs)
  64.     {
  65.         val_ = rhs;
  66.     }
  67. private:
  68.     value_type val_;
  69. };

测试一下

  1. class MyClass
  2. {
  3. public:
  4.     MyClass() {}
  5.     Property<int, paReadWrite>  prw_count; 
  6.     Property<double, paRead>    pr_average; 
  7.     Property<void *, paWrite>   pw_param; 
  8. };
  9. int _tmain(int argc, _TCHAR* argv[])
  10. {
  11.     MyClass mc;
  12.     mc.prw_count = 2; //allow read
  13.     int count = mc.prw_count; //allow write
  14. //  mc.pr_average = 2.0f; //disable write
  15. //  double &raver = mc.pr_average; //disable write indirect
  16.     double aver = mc.pr_average; //allow read
  17. //  void * p = mc.pw_param; //disable read
  18. //  const void * p = mc.pw_param; //disable read
  19.     mc.pw_param = NULL; //allow write
  20.     return 0;
  21. }

测试内注释掉的代码启用后编译会失败,暂时不耗费时间去想如何显示一个友好的错误消息了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值