解析const和非const成员函数指针

时间:2019-10-10 03:58:53

标签: c++ member-function-pointers

在下面的代码段中,我希望能够从A::foo调用doWork

但是,由于fooconst和非const)有两个重载,因此编译器无法解析在调用doWork中我指的是哪个。 有没有办法告诉编译器我的意思是哪一个。

我无法更改struct A

我可以用doWork的签名或doWork的调用来做一些事情,以便总是选择说一个const。

我知道的一个解决方案是给函数指针类型作为doWork的参数,而不是模板(像这样) void doWork(void (A::*fun)(void) const){ 但这有点难看,我希望找到一个基于模板的解决方案(如果存在)

struct A{
    void foo() const {
    }
    void foo(){
    }
    void bar(){
    }
    void bar() const {
    }
};

template<typename F>
void doWork(F fun){
    const A a;
    (a.*fun)();
}

int main()
{
    doWork(&A::foo); //error: no matching function for call to ‘doWork()’
    doWork(&A::bar); // error: no matching function for call to ‘doWork()’
    return 0;
}

2 个答案:

答案 0 :(得分:3)

您可以使用static_cast来指定使用哪个。

  

static_cast也可用于消除函数重载的歧义,例如   进行函数到指针的转换为特定类型,如

std::for_each(files.begin(), files.end(),
              static_cast<std::ostream&(*)(std::ostream&)>(std::flush));

例如

doWork(static_cast<void (A::*)(void) const>(&A::foo));
doWork(static_cast<void (A::*)(void) const>(&A::bar));

或明确指定模板参数。

doWork<void (A::*)(void) const>(&A::foo);
doWork<void (A::*)(void) const>(&A::bar);

答案 1 :(得分:1)

您可以使用:

template <typename T>
void doWork(void (T::*fun)() const){
    const A a;
    (a.*fun)();
}

更通用的功能模板将使用const T a

template <typename T>
void doWork(void (T::*fun)() const){
    const T a;
    (a.*fun)();
}

请注意,第二个版本在任何地方都不假定A