【发布时间】:2013-05-17 07:25:36
【问题描述】:
我正在用 C++ 实现类似于 C# 的属性类。 所以我必须提供对内部字段(mother::_i)到属性字段(mother::i)的访问权限。
我找到了一些解决方案,但没有完美的解决方案。
首先,我创建了一个方法,通过调用 RProperty<...>::SetOwner(mother&) 之类的方法在运行时提供所有者(在本例中为母亲)的指针。但它需要额外的代码才能在运行时使用我的属性类和成本。
其次我想到了RProperty的这个指针和它自己的成员指针可以找到所有者的指针。显然,ownerpointer = this - &mother::i。但是提供指向成员本身的成员指针会给我编译时错误。我尝试了一种使用“空”结构来提供指向属性的成员指针的棘手方法。但事实证明 sizeof(struct empty) 不为零。每个实例都会花费不必要的额外内存。我在这个问题上纠结了几天。
谁有好主意? :)
代码有效但并不完美:
#include "stdafx.h"
struct empty{};
template<typename TCLASS, typename TFIELD>
class RPropertyBase
{
protected:
RPropertyBase(){ }
TCLASS& getOwner() const { };
};
template<typename TCLASS, typename TFIELD, TFIELD TCLASS::*PFIELD, empty TCLASS::*PTHIS>
class RProperty : RPropertyBase<TCLASS, TFIELD>
{
protected:
TCLASS& getOwner() const { return *(TCLASS*)((unsigned int)this-(unsigned int)&(((TCLASS*)0)->*PTHIS)-sizeof(empty) ); }
public:
RProperty<TCLASS, TFIELD, PFIELD, PTHIS>& operator=(const TFIELD& A){ getOwner().*PFIELD = A; return *this; }
operator TFIELD&() const { return getOwner().*PFIELD; }
};
class mother
{
int _i;
template<typename C>
struct __Propertyi : public RProperty<C, int, &C::_i, &C::_empty>
{
using RProperty<C, int, &C::_i, &C::_empty>::operator=;
};
public:
empty _empty;
__Propertyi<mother> i;
};
int _tmain(int argc, _TCHAR* argv[])
{
mother a;
a.i = 1;
int bb = (a.i);
return 0;
}
【问题讨论】:
-
似乎是一个非常复杂的方法,为什么不简单的 setter/getter 呢?或者我敢说,即使是简单的
struct? -
用于消除getter/setter地狱,学习模板和C++。结果不会显得我想的那么无用。
-
__Propertyi是为实现保留的名称。请不要使用以下划线或双下划线开头的名称。 -
当你有属性时(
_j、_k等)你会定义内部类n次吗?或者有模板?如果您有模板,则意味着您将通用逻辑应用于所有属性;后者没有给你任何超过struct或class与公共成员。如果每种类型都有一个类,那么您现在就有了n类,然后将其扩展。我的观点;它比 getter/setter 地狱更糟糕。在这种情况下,如果您真的想这样做,最好使用一个简单的宏#define PROPERTY(name, type) type get##name() const {...}; void set##name(type v_) { name = v_; }... -
费尔南德斯,谢谢。