假设我们需要实例化一个从非平凡代码中调用某个类方法的函数。
#include <iostream>
class A
{
public:
int f() { return 1; }
int g() { return 2; }
};
template <class T, int (T::*method)()>
int func(T& x)
{
// some complex code here calling method()
return (x.*method)();
}
int main()
{
A a;
std::cout << func<A, &A::f>(a) << "\n"
<< func<A, &A::g>(a) << "\n";
return 0;
}
此代码编译并正常工作。现在假设这两个方法实际上是const和非const,如下所示:
class A
{
int val_;
public:
A() : val_(0) {}
int alloc() { return ++val_; }
int get() const { return val_; }
};
这次我们不能使用相同的方法,因为成员函数由于const限定符而具有不同的签名。将问题移动到运行时似乎没有解决任何问题,有没有办法避免在这种情况下将func()重写为两个函数?
答案 0 :(得分:1)
您可以将传递方法从模板参数更改为函数参数吗? 如果是,这可行:
#include <iostream>
class A
{
public:
int f() { return 1; }
int g() const { return 2; }
};
template <class T, class F>
int func(F method, T& x)
{
// some complex code here calling method()
return (x.*method)();
}
int main()
{
A a;
std::cout << func(&A::f, a) << "\n"
<< func(&A::g, a) << "\n";
return 0;
}