如何强制调用const限定函数重载?

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

选项1:

通过指向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)

选项#2:

使调用函数成为const合格函数:

void call() const
//          ~~~~^
{
    fun();
}
Run Code Online (Sandbox Code Playgroud)

DEMO

  • @Thebluefish`const_cast`通常表示丢弃*constness*(我在这里做相反的事情),我不喜欢将它用于常规的隐式转换,`const_cast`无条件地执行它的转换 (3认同)

lee*_*mes 18

你必须在const指针上调用该函数.为此,我建议创建一个本地指针变量:

const auto *c = this;
c->fun();   // calls fun() const

fun();      // calls fun()
Run Code Online (Sandbox Code Playgroud)

Live Demo


如果您经常需要,和/或如果您不想使用局部变量,您还可以引入一个私有辅助函数,它返回一个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)

Live Demo


另一种选择是编写一个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)

Live Demo


为了论证(我不推荐以下内容),结合上面的建议,您还可以引入一个扩展为的全局宏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)

Live Demo