看了几个给 C++ 添加 property 的实现,觉得都挺麻烦,现在自己造个
- template<class T>
- struct TypeTraits
- {
- typedef T value_type;
- typedef T &reference;
- typedef T const &const_reference;
- typedef T *pointer;
- typedef T const *const_pointer;
- };
- typedef enum {paReadWrite, paRead, paWrite} PropertyAccessRight;
- template <class T, PropertyAccessRight = paReadWrite>
- class Property
- {
- public:
- typedef typename TypeTraits<T>::value_type value_type;
- typedef typename TypeTraits<T>::reference reference;
- typedef typename TypeTraits<T>::const_reference const_reference;
- public:
- Property():val_(value_type()) {};
- Property(const_reference pval):val_(pval) {}
- operator reference()
- {
- return val_;
- }
- operator const_reference() const
- {
- return val_;
- }
- reference operator = (const_reference rhs)
- {
- return (val_ = rhs);
- }
- private:
- value_type val_;
- };
- template <class T>
- class Property<T, paRead>
- {
- public:
- typedef typename TypeTraits<T>::value_type value_type;
- typedef typename TypeTraits<T>::reference reference;
- typedef typename TypeTraits<T>::const_reference const_reference;
- public:
- Property():val_(value_type()) {};
- explicit Property(const_reference pval):val_(pval) {}
- operator const_reference() const
- {
- return val_;
- }
- private:
- value_type val_;
- };
- template <class T>
- class Property<T, paWrite>
- {
- public:
- typedef typename TypeTraits<T>::value_type value_type;
- typedef typename TypeTraits<T>::reference reference;
- typedef typename TypeTraits<T>::const_reference const_reference;
- public:
- Property():val_(value_type()) {};
- Property(const_reference pval):val_(pval) {}
- void operator = (const_reference rhs)
- {
- val_ = rhs;
- }
- private:
- value_type val_;
- };
测试一下
- class MyClass
- {
- public:
- MyClass() {}
- Property<int, paReadWrite> prw_count;
- Property<double, paRead> pr_average;
- Property<void *, paWrite> pw_param;
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- MyClass mc;
- mc.prw_count = 2; //allow read
- int count = mc.prw_count; //allow write
- // mc.pr_average = 2.0f; //disable write
- // double &raver = mc.pr_average; //disable write indirect
- double aver = mc.pr_average; //allow read
- // void * p = mc.pw_param; //disable read
- // const void * p = mc.pw_param; //disable read
- mc.pw_param = NULL; //allow write
- return 0;
- }
测试内注释掉的代码启用后编译会失败,暂时不耗费时间去想如何显示一个友好的错误消息了
本文介绍了一种使用模板元编程在C++中实现属性(property)的方法,该方法支持不同类型的读写权限,并通过示例展示了如何在类中使用这些属性。
9601

被折叠的 条评论
为什么被折叠?



