如何避免重复的 const 和非常量虚函数?可能吗?
How to avoid repeated const and non-const virtual functions ? is it possible?
假设我有一个具有以下 virtual 函数的基础 class:
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 在他的书中建议这种方法(尽管情况是相反的) - 但它真的安全吗(如果是,是吗 'future-proof'还有?)来自例如成员是 const ?
我可以用一些 search/replace 来扭转这种情况,但是在所有 classes 上都有这两种实现似乎太多了 'copy-paste' 反模式。
but is it really safe
很遗憾:
变体 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();
}
};
承认,第二种情况可能不太可能——但也不是不可能。因此,在这两种变体中的任何一种中,都隐藏着引发未定义行为的机会...
假设我有一个具有以下 virtual 函数的基础 class:
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 在他的书中建议这种方法(尽管情况是相反的) - 但它真的安全吗(如果是,是吗 'future-proof'还有?)来自例如成员是 const ?
我可以用一些 search/replace 来扭转这种情况,但是在所有 classes 上都有这两种实现似乎太多了 'copy-paste' 反模式。
but is it really safe
很遗憾:
变体 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();
}
};
承认,第二种情况可能不太可能——但也不是不可能。因此,在这两种变体中的任何一种中,都隐藏着引发未定义行为的机会...