c++ - 在宏的帮助下创建类属性

标签 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);
};

但无论我多么努力,我就是无法接近这个单行解决方案。如果有人曾经实现过类似的东西,我将不胜感激。

最佳答案

首先请注意,属性不是惯用的 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);
};

关于c++ - 在宏的帮助下创建类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25744770/

相关文章:

qt - 按下鼠标时获取鼠标事件

qt - 在QTreeView中拖放,removeRows没有被调用

c - 使用宏定义简化编码

c++ - 模板相当于宏中的#var

c++ - Windows 和 Linux 上不同的 rand() 结果

c++ - 将 QString 与 wchar_t 一起使用时未解析的外部符号

c++ - KEY_WOW64_32KEY 未从 x64 应用程序重定向

c - 使用#define 创建与 C89 std 兼容的虚拟记录

c++ - 使用c++/WinRT Direct3D UWP Game DR模板Direct X11的错误消息

c++ - “类”没有命名类型