如何定义一个没有重复代码的继承的 const class 成员函数?
How to define a const class-member function that is inheriting without duplicated-code?
我正在尝试定义一个 class(其最小版本)如下所示:
class Base{
int i;
public:
Base(int i_): i(i_){}
int& at(size_t index) {return i;}
const int& at(size_t index) const {return i;}
};
(是的。它有一个 index
因为我真正想要创建的 class 总是需要它,所以以免想象它是必要的)
我想像这样继承 class:
class SonClass : public Base{
public:
SonClass(int i): Base(i){}
int& at(size_t index){
do_something_more();
return Base::at(index);
}
const int& at(size_t index) const {
do_something_more();
return Base::at(index);
}
};
看来at
函数的版本都是一样的。无论如何要避免这种情况?或者有什么更好的方法吗?这看起来很基本,但我有 5 个功能因此都是相同的。
这是 const_cast
有用的少数情况之一。您可以按如下方式使用它:
int& at(size_t index)
{
return const_cast<int&>(std::as_const(*this).at());
}
C++17 之前你可以用 static_cast<const my_class&>
替换 std::as_const
我正在尝试定义一个 class(其最小版本)如下所示:
class Base{
int i;
public:
Base(int i_): i(i_){}
int& at(size_t index) {return i;}
const int& at(size_t index) const {return i;}
};
(是的。它有一个 index
因为我真正想要创建的 class 总是需要它,所以以免想象它是必要的)
我想像这样继承 class:
class SonClass : public Base{
public:
SonClass(int i): Base(i){}
int& at(size_t index){
do_something_more();
return Base::at(index);
}
const int& at(size_t index) const {
do_something_more();
return Base::at(index);
}
};
看来at
函数的版本都是一样的。无论如何要避免这种情况?或者有什么更好的方法吗?这看起来很基本,但我有 5 个功能因此都是相同的。
这是 const_cast
有用的少数情况之一。您可以按如下方式使用它:
int& at(size_t index)
{
return const_cast<int&>(std::as_const(*this).at());
}
C++17 之前你可以用 static_cast<const my_class&>
std::as_const