如何在头文件c ++中的类定义中注册变量

时间:2014-02-24 08:29:53

标签: c++ macros

我正在编写一些代码,其中使用宏创建类的getter和setter。像

这样的东西
class MyClass : MyStruct
{
    MEMBER(m_member1);
    MEMBER(m_member2);
    MEMBER(m_member3);
    MEMBER(m_member4);
    MEMBER(m_member5);
}

其中MEMBER是一个宏,它为MyStructBase中定义的成员创建一个setter和getter。

我想修改MEMBER宏,为每个成员添加某种注册。因此,除了创建setter和getter之外,MEMBER宏还可以为每个成员调用m_myRegistry.register(Member1)。基本上能够注册该类的每个成员而不必重写代码(我们有非常大量的这个MyClass类,如果我只需要修改宏而没有类的构造函数,那么将节省大量工作)

所以,我的问题是,有没有办法从类定义中调用函数来解决这个问题?我认为通过声明一个专门用于实际成员的模板的静态类可能是可能的,但我想不出怎么做。

编辑:我被要求显示使用的宏。这是非常复杂的,我不确定我的公司是否会特别高兴我发布他们的代码堆栈溢出,所以我将发布它的简化版本:

 #define MEMBER(membername)
    // some boost magic to typdef membername##traits::Type to the type of membername
    ...
    //
    membername##traits::Type get##membername()
    {
        return membername;
    }
    void set##membername(const membername##traits& a)
    {
         membername = a;
    }

所以我想要的是修改宏来做类似的事情:

 #define MEMBER(membername)
    // some boost magic to typdef membername##traits::Type to the type of membername
    ...
    //
    membername##traits::Type get##membername()
    {
        return membername;
    }
    void set##membername(const membername##traits& a)
    {
         membername = a;
    }

    m_objectRegistry.register(membername);

2 个答案:

答案 0 :(得分:1)

您可以定义另一个注册原始成员的成员(仅适用于C ++ 11):

struct MyRegistration
{
    template <typename T>
    MyRegistration(ObjectRegistry& objectRegistry, T member)
        {objectRegistry.register(member);}
};

...

#define MEMBER(membername) \
    /* some boost magic ... */ \
    MyRegistration<membername##traits::Type> \
        dummy##membername{m_objectRegistry, membername};

这增加了班级中的成员数量,因此可能不方便。

新虚拟成员的声明还提到了其构造函数的参数。

此代码注册您的类的每个实例(对象)的成员;我不确定这是你想要的。如果您只想注册一次会员,static可能会有效。

答案 1 :(得分:0)

宏只是一段代码,在编译之前将在被调用的位置替换。所以只要尝试编写宏中的所有代码。无论如何,如果你想在宏内部调用一个函数,那么最好将该函数创建为Global而不是创建一个静态类。