如何避免重复的const和非const虚拟函数?有可能吗?

时间:2019-06-25 08:55:43

标签: c++ const c++17 virtual-functions

假设我有一个带有以下函数的基类:

virtual int* get(){ return nullptr; }

我想提供一个const版本(请记住,我在遗留代码中有50种不同的实现方式)

const int* get() const { return const_cast<decltype(this)>(this)->GetReturn(); };//NEED CODE BADLY: const_cast :/

但是这个想法需要使用const_cast-斯科特·迈耶(Scott Meyer)在他的书中建议使用这种方法(尽管情况已经逆转了)–但是它真的安全吗(如果是的话,它也是“面向未来的”) ?),例如成员是const?

我可以通过一些搜索/替换来扭转这种局面,但是在所有类上同时实现这两种实现似乎是过多的“复制粘贴”反模式。

1 个答案:

答案 0 :(得分:3)

  

但是真的安全吗

不幸的是:

变种1:

class C
{
    int n;
public:
    int* get() { ++n; return &n; }
    int const* get() const { return const_cast<decltype(this)>(this)->get(); }
};

变种2:

class C
{
    int const n;
public:
    int const* get() const { return &n; }
    int* get() { return const_cast<int*>(const_cast<decltype(this) const*>(this)->get()); }
    void demo() // non-const!
    {
        ++*get();
    }
};

诚然,第二种情况不太可能发生,但也不是没有可能。因此,在这两个变体中的任何一个中,都有隐藏的机会引发不确定的行为...