可能重复:
Elegant solution to duplicate, const and non-const, getters?
假设我有一个c ++类,其成员函数为const重载,如下所示:
Type* DoSomething();
const Type* DoSomething() const;
如果这是一个更大,更复杂的成员,那么如何防止必须两次编写相同的代码?无法从const中调用任何非const函数。从非const中调用const版本会导致一个const指针必须被转换为非const(这有点像imo)。
答案 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() ) );
}
这种技术可以应用于许多情况(但不是全部,即如果行为明显不同)。