const重载而不必写两次函数

时间:2012-07-25 18:04:27

标签: c++ const overloading

  

可能重复:
  Elegant solution to duplicate, const and non-const, getters?

假设我有一个c ++类,其成员函数为const重载,如下所示:

        Type*  DoSomething();
const   Type*  DoSomething() const;

如果这是一个更大,更复杂的成员,那么如何防止必须两次编写相同的代码?无法从const中调用任何非const函数。从非const中调用const版本会导致一个const指针必须被转换为非const(这有点像imo)。

3 个答案:

答案 0 :(得分:7)

您可以委托模板静态成员函数,如:

class Widget
{
    Type member;

    template<typename Result, typename T>
    static Result DoSomethingImpl(T This)
    {
        // all the complexity sits here, calculating offsets into an array, etc
        return &This->member;
    }

public:
            Type*  DoSomething() { return DoSomethingImpl<Type*>(this); }
    const   Type*  DoSomething() const { return DoSomethingImpl<const Type*>(this); }
};

在C ++ 11中,您甚至可以使用:

删除非推断模板参数
static auto DoSomethingImpl(T This) -> decltype(This->member)

答案 1 :(得分:1)

你做了一次,并且第二次用类上的const属性做,你可以使用const_cast

class Foo
{
          Type*  DoSomething()
  {
    // Lots of stuff
  }
  const   Type*  DoSomething() const
  {
    return const_cast<Foo*>(this)->DoSomething();
  }
}

答案 2 :(得分:1)

使用template method模式从中提取公共代码。例如

inline const T* prev(size_t i) const
{
    return &FBuffer[ AdjustIndex(i) ];
}

inline T* prev(size_t i)
{
    return &FBuffer[ AdjustIndex(i) ];
}

inline size_t AdjustIndex( size_t i ) const
{
    return Math::ModInt( static_cast<int>( FHead ) - 1 - i, static_cast<int>( FBuffer.size() ) );
}

这种技术可以应用于许多情况(但不是全部,即如果行为明显不同)。