避免代码重复(const-correctness)redux

时间:2010-09-25 22:38:47

标签: c++ const code-duplication const-correctness

我在这里读到question here关于const-correctness的内容。 Scott Meyer解决方案似乎是一个很好的解决方案,但是如果你有一个使用this指针的成员函数(需要const和非const版本),那该怎么办呢?如果成员函数为const,那么this会自动表示const this,这可能会使代码的大部分位于单个const函数中变得困难。

我遇到的一种可能的解决办法就是将对this的引用作为参数传递给const函数,因此该函数可以使用该引用而不是直接使用this指针。但是,这样安全吗?它似乎是安全的(如果非常hacky),因为你实际上并没有在const-object上使用const_cast。相反,您只是通过传递对象的非const引用来绕过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版本的函数时必须复制大量代码的好方法,但这样安全吗?或者是否会以某种方式导致未定义的行为?

1 个答案:

答案 0 :(得分:0)

请注意,即使您处于const f1()函数中并且可以修改“this”,f2()也会被标记为非const,因此通过调用f2()对象可能会被修改。仅f1()不会让你自己(或任何const对象)修改“this”。您甚至无法在f2()对象的帮助下调用const Foo,因此这不会带来任何好处。

换句话说 - 在你的例子中,非const f1()就足够了。您不需要f1() const或两个版本。


<强>更新 现在,您将无法修改从self调用f1()的{​​{1}}“const”版本中的void f1(const Foo & self) const