解析const和non-const成员函数指针

Resolve const and non-const member function pointer

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

但是因为 foo 有两个重载( const 和非 const ),编译器无法解析我在调用 doWork 时的意思. 有没有办法告诉编译器我的意思是哪个。

我无法更改struct A

我可以在 doWork 的签名或 doWork 的调用中做一些事情来总是选择常量吗?

我知道的一个解决方案是将函数指针类型作为 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;
}

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

static_cast may also be used to disambiguate function overloads by performing a function-to-pointer conversion to specific type, as in

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);

您可以使用:

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