类的只读成员变量

dem*_*rge 4 c++ c++11

这个答案的启发下,我使用以下解决方案作为只读成员变量:

template <class T, class OWNER>
class readonly
{
    friend OWNER;

public:
    explicit readonly(const T &t) : m_t(t)
    {
    }

    ~readonly()
    {
    }

    operator const T&() const
    {
        return m_t;
    }

private:
    T& operator =(const T &t)
    {
        m_t = t; 
        return m_t;
    }

    T m_t;
};
Run Code Online (Sandbox Code Playgroud)

哪个效果很好,为了优化性能,我会像这样使用它:

class A
{
public:
    A()
    {
    }

    ~A()
    {
    }

#ifdef _DEBUG     // DON'T USE THIS SWITCH, SEE ANSWERS BELOW!
    readonly<int, A> m_x, m_y;
#else
    int m_x, m_y;
#endif
};
Run Code Online (Sandbox Code Playgroud)

但是,我希望消除预编译器开关,它检查我们是否正在进行调试或发布构建......是否有人使用宏或聪明的模板技巧看到解决方案?

编辑:我已经在循环中检查了性能,它使用VS2010产生大约15~20%的开销.它不会产生相同的代码,启用自动内联.

编辑#2:我创建了一个单元测试,消除了所有其他的东西.我没有性能损失了,太好了,毕竟没有问题.谢谢您的帮助!我已经修复了构造函数,很好的调用.

Cat*_*lus 5

您的优化是无用的,将产生完全相同的代码.所有这些readonly都是微不足道的,并且将被内联,从而消除了使用原始T可能产生的任何开销.因此,解决方案是不修复不存在的问题,并且readonly<int, A>无论是否是调试版本都使用.

正如@MooingDuck指出的那样,你应该改变你的构造函数以使用init list(并且可能也使它显式化).

  • 更糟糕的是*将导致相同的代码*:可以以您可能不想要的方式生成*不同的*代码(即删除用户定义的转换可能会启用不同的重载并且可能以应用程序中的不同语义结束). (2认同)