解析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
。
在下面的代码片段中,我希望能够从 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 instd::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
。