在下面的代码段中,我希望能够从A::foo
调用doWork
。
但是,由于foo
(const
和非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;
}
答案 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
。