在宏之后恢复访问修饰符

时间:2015-01-09 16:21:51

标签: c++ macros access-modifiers

要声明代码库中许多类所需的方法列表,我们使用宏,例如:

#define DECLARE_METHODS()             \
    public:                           \
        virtual void foo1(/*args*/);  \
        virtual void foo2(/*args*/);  \
        [...]                         \
    protected:                        \
        virtual void bar(/*args*/);   \
    public:

它通常像这样使用:

class Class
{
public:
    Class();
    ~Class();

    DECLARE_METHODS();

    /*other public members*/

private:
    /*private members*/
};

但是,如果像这样使用它会引起一些破坏:

class Class
{
public:
    Class();
    ~Class();

private:
    DECLARE_METHODS();

    /*private members*/
};

...因为它偷偷地向下面的所有内容声明了一个公共访问修饰符。

它被使用了数千次,所以用私有代替最终的公共:过于耗费时间,因为几乎所有的客户都需要移动宏来移动宏或打开一个公共访问修饰符适用。 删除所有修饰符并使bar()不受保护不是一种选择。

有没有办法知道在特定的代码部分中使用了哪个访问修饰符?是否有可能断言这个宏从未在非公共范围内使用,或以某种方式记住并恢复宏末尾的正确访问修饰符?

2 个答案:

答案 0 :(得分:3)

简答:否

原因:在任何c ++开始被解释为c ++之前,预处理器完全完成了宏扩展。

这意味着预处理器对代码视而不见 - 它可能是java,c,text,甚至是python(如果你没有对它进行评论),预处理器会愉快地扩展宏。

您想要做的事情可以通过奇怪的重复模板模式来实现http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern

例如,这就是ATL如何自动为您实现通用COM接口。

答案 1 :(得分:-1)

编辑:这实际上不起作用,缩回。

Haven没有检查过这个(我不会使用private),但请尝试:

#define DECLARE_METHODS() \
    public virtual void foo1(/*args*/); \
    public virtual void foo2(/*args*/); \
    [...] \
    protected virtual void bar(/*args*/); \
    /* done */

这(应该)避免更改后续成员的可见性说明符。