借助宏创建类属性

时间:2014-09-09 12:33:26

标签: c++ qt macros properties

我需要创建一些机制,允许我声明类属性(即:成员变量),这些属性可以通过它们的名称访问,也可以在通常的类成员访问旁边访问。 Qt用非常方便的Q_PROPERTY宏解决了这个问题,另一端用moc消化了。我没有这两步编译的奢侈,而我能得到的最接近的是:

class SomeClass
{
public:
SomeClass() : bla(9), v(9.4) {}
virtual ~SomeClass(){}

int bla;
double v;

BEGIN_ATTRIBUTES(SomeClass)
    ATTRIBUTE(int, bla)
    ATTRIBUTE(double, v)
END_ATTRIBUTES()
};

哪里有明显的宏隐藏了一个丑陋的机制来存储关于类成员的一些数据,这些数据被输入到一个可怕的模板化代码怪物中,这样可行,但这样做的缺点是你需要首先声明类属性然后你有一个单独的部分,你实际上将类成员指定为属性。

我更像是一些代码:

class SomeClass
{
public:
SomeClass() : bla(9), v(9.4) {}
virtual ~SomeClass(){}

ATTRIBUTE(int, bla);
ATTRIBUTE(double, v);
};

但无论我怎么努力,我都无法接近这个有线的解决方案。如果有人曾经实施过这样的事情,我会感激一些提示。

1 个答案:

答案 0 :(得分:1)

首先让我注意,属性不是惯用的C ++,而且语言会阻止您尝试使用它们。

那就是说,虽然你的问题不明确,但是你尝试过这样的事情:

#define ATTRIBUTE(type, name) \
type name##_; \
const type& get_##name() const { return name##_; } \
void set_##name(const type& v) { name##_ = v; }

class SomeClass
{
public:
    SomeClass() : bla_(9), v_(9.4) {}
    virtual ~SomeClass(){}

    ATTRIBUTE(int, bla);
    ATTRIBUTE(double, v);
};