避免代码重复(常量正确性)redux
Posted
技术标签:
【中文标题】避免代码重复(常量正确性)redux【英文标题】:Avoiding code duplication (const-correctness) redux 【发布时间】:2010-09-25 22:38:46 【问题描述】:我在这里阅读了这个question here 关于 const 正确性的内容。 Scott Meyer 解决方案似乎是一个很好的解决方法,但是如果您有一个使用 this
指针的成员函数(需要 const 和非 const 版本)怎么办。如果成员函数是const
,那么this
自动表示const this
,这使得在大部分代码所在的位置很难有一个const
函数。
我想到的一种可能的解决方法是将this
的引用作为参数传递给 const 函数,因此该函数可以使用该引用而不是直接使用this
指针。但是,这样安全吗?它似乎是安全的(如果非常hacky),因为您实际上并没有在const-object上使用const_cast
。相反,您只是通过传递对象的非常量引用来规避const
成员函数提供的契约。
例如:
class Foo
private:
template <class SelfReference>
void f1(SelfReference& self) const
// We now might have a non-const reference to "this", even though
// we're in a const member function. But is this safe???
public:
void f2()
f1(*this);
void f2() const
f1(*this);
;
这似乎提供了一种很好的方法,可以避免在需要函数的 const 和非 const 版本时重复大量代码,但这安全吗?还是它会以某种方式导致未定义的行为?
【问题讨论】:
可能是this的副本? 【参考方案1】:注意,即使你在 const f1()
函数中并且可以修改“this”,f2()
也被标记为非常量,因此通过调用 f2()
对象可能会被修改。并且 f1()
单独不会让您在其自身(或任何 const 对象)中修改“this”。你甚至不能调用f2()
来帮助const Foo
对象,所以这不会带来任何好处。
换句话说-在您的示例中,非常量 f1()
就足够了。这里不需要f1() const
或两个版本。
更新
现在,您将无法在 f1()
的“const”版本中修改 self
,即从 void f2() const
调用的 void f1(const
Foo & self) const
。
【讨论】:
我稍微修改了一下:想法是你有两个版本的 f2(const 和 non-const),它们都调用 f1,即const
。但是,f2 的非 const 版本传递一个非 const 自引用,而 f2 的 const 版本传递一个 const 自引用。所以想法是大部分逻辑都可以进入 f1 以避免重复。
我明白这一点 - 但这个想法实际上并不是从常量成员函数修改this
,而只是为了避免代码重复。因此,如果出于任何原因 f1 必须使用 this
指针,例如将其传递给迭代器或其他东西,则无需编写 f1 的单独 const 版本。
@Channel72:如果你不修改对象,那么const
版本的方法就足够了。您可以从非常量调用const
函数。在这种情况下,您永远不需要非常量版本的函数,因此不会重复代码。以上是关于避免代码重复(常量正确性)redux的主要内容,如果未能解决你的问题,请参考以下文章