0

可能的重复:
如何删除相似的 const 和非常量成员函数之间的代码重复?

在以下示例中:

template<typename Type, unsigned int Size>
class MyClass
{
    public: inline Type& operator[](const unsigned int i) 
    {return _data[i];}

    public: inline const Type& operator[](const unsigned int i) const
    {return _data[i];}   

    protected: Type _data[Size];
};

const 和 non-constoperator[]是独立实现的。

就设计而言,最好有:

  • 1)像这里的两个独立实现
  • 2) 两个函数之一调用另一个函数

如果解决方案 2) 更好,给定示例的代码是什么?

4

3 回答 3

4

它是一种众所周知且被广泛接受的实现模式,当非常量方法通过其对应的 const 实现时,如

 class some_class {

   const some_type& some_method(arg) const
   {
     ...;
     return something;
   }

   some_type& some_method(arg)
   {
     return const_cast<some_type&>(
       const_cast<const some_class *>(this)->some_method(arg));
   }
 };

这是一种完全有效的技术,在方法主体相对较重的情况下,它基本上没有可比的(方便的)替代方案。的弊端const_cast明显小于重复代码的弊端。

但是,当方法的主体本质上是单行代码时,最好坚持使用明确的相同实现,以避免这种难以阅读的const_casts 堆积。

人们可能会想出一种形式上更好的无铸件解决方案,其实施方式如下:

 class some_class {

   template <typename R, typename C>
   static R& some_method(C *self, arg)
   {
     // Implement it here in terms of `self->...` and `R` result type
   }

   const some_type& some_method(arg) const
   {
     return some_method<const some_type>(this, arg);
   }

   some_type& some_method(arg)
   {
     return some_method<some_type>(this, arg);
   }
 };

但对我来说,它看起来比使用const_cast.

于 2012-12-10T02:05:03.417 回答
1

你不能让任何一个实现调用另一个实现而不抛弃 constness,这是一个坏主意。

const方法不能调用非const一个。

const方法不应调用该方法,const因为它需要转换返回类型。

于 2012-12-10T01:27:45.327 回答
0

不幸的是,“constness”模板不起作用,但我仍然认为值得考虑整体想法:

// NOTE: this DOES NOT (yet?) work!
template <const CV>
Type CV& operator[](unsigned int index) CV {
    ...
}

暂时,我只实现两次微不足道的功能。如果代码变得比一两行更复杂,我会将细节分解到函数模板中并委托实现。

于 2012-12-10T01:32:55.530 回答