daw*_*wid 21 c++ overloading const
我正在尝试const在类中调用函数,但const存在具有相同名称的非函数.
注意:我不能只改变名字.
class MyQuestion
{
void fun()
{
cout<<"a";
}
void fun()const
{
cout<<"b";
}
void call()
{
fun();//<how to call fun() const?
}
};
Run Code Online (Sandbox Code Playgroud)
Pio*_*cki 22
通过指向const限定类型的指针调用该函数:
void call()
{
static_cast<const MyQuestion*>(this)->fun();
// ~~~~^
}
Run Code Online (Sandbox Code Playgroud)
void call()
{
const auto* that = this;
//~~^
that->fun();
}
Run Code Online (Sandbox Code Playgroud)
void call()
{
std::as_const(*this).fun();
// ~~~~~~~^
}
Run Code Online (Sandbox Code Playgroud)
使调用函数成为const合格函数:
void call() const
// ~~~~^
{
fun();
}
Run Code Online (Sandbox Code Playgroud)
lee*_*mes 18
你必须在const指针上调用该函数.为此,我建议创建一个本地指针变量:
const auto *c = this;
c->fun(); // calls fun() const
fun(); // calls fun()
Run Code Online (Sandbox Code Playgroud)
如果您经常需要,和/或如果您不想使用局部变量,您还可以引入一个私有辅助函数,它返回一个const this指针:
const MyQuestion *const_this() const {
return this;
}
Run Code Online (Sandbox Code Playgroud)
然后fun像这样打电话:
const_this()->fun(); // calls fun() const
fun(); // calls fun()
Run Code Online (Sandbox Code Playgroud)
另一种选择是编写一个make_const函数来执行对const指针的强制转换,而不需要提及类名(它基本上是static_cast一个推导类型的const指针):
template <typename T>
const T* make_const(T *ptr) {
return ptr;
}
Run Code Online (Sandbox Code Playgroud)
然后fun像这样打电话:
make_const(this)->fun(); // calls fun() const
fun(); // calls fun()
Run Code Online (Sandbox Code Playgroud)
为了论证(我不推荐以下内容),结合上面的建议,您还可以引入一个扩展为的全局宏make_const(this):
#define const_this make_const(this)
Run Code Online (Sandbox Code Playgroud)
然后fun像这样打电话:
const_this->fun(); // calls fun() const
fun(); // calls fun()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4219 次 |
| 最近记录: |