我似乎在我的代码中经常出现这种模式,除了参数/返回的常量之外,两个函数执行相同的任务。
int& myClass::getData()
{
return data;
}
// called for const objects
const int& myData::getData() const
{
return data;
}
这冒犯了我的DRY感。对于单行程序来说这不是问题,但随着getData()变大,显然会出现重复。
我知道为什么我需要这两种方法,但觉得应该有更好的方法来实现它。是否有一个可以提供帮助的模板技巧,或者我应该有一个方法可以调用另一个方法来根据需要来回转换const?
ADDED:作为一个更真实的例子,这是典型的STL vector :: at()实现的示例:
const_reference at(size_type _Off) const
{ // subscript nonmutable sequence with checking
if (size() <= _Off)
_Xran();
return (*(begin() + _Off));
}
reference at(size_type _Off)
{ // subscript mutable sequence with checking
if (size() <= _Off)
_Xran();
return (*(begin() + _Off));
}
答案 0 :(得分:3)
使用以下技巧(我最初从Scott Meyers的书 Effective C ++ 获得):
int& myClass::getData()
{
// This is safe because we know from out here
// that the return value isn't really const
return const_cast<int&>(const_cast<const myClass&>(*this).getData());
}
const int& myData::getData() const
{
return data;
}
显然对于像这样的短函数,你可能会发现复制代码更容易,但是当你有更长的函数时(例如vector<T>::at
或者需要进行大量更改),这个习惯用法很有用。 p>
答案 1 :(得分:2)
提供如下功能:
int& myClass::getData()
{
return data;
}
可能是错误的 - 您也可以公开'数据'。第二个应该写成:
int myData::getData() const
{
return data;
}
答案 2 :(得分:1)
您引用的标准库函数重复代码的原因是标准库函数需要尽可能高效。在那里调用另一个函数(正如其他人正确建议的那样)可能会搞砸了。但是你的代码可能在不那么严格的性能限制下,所以你应该尽可能使用通用代码。