例如,给定以下代码
class A {
public:
double operator()(double foo) {
return foo;
}
};
class B {
public:
double operator()(double foo, int bar) {
return foo + bar;
}
};
我想编写两个版本的fun
,一个适用于具有 A 签名的对象,另一个适用于具有 B 签名的对象:
template <typename F, typename T>
T fun(F f, T t) {
return f(t);
}
template <typename F, typename T>
T fun(F f, T t) {
return f(t, 2);
}
我期待这种行为
A a();
B b();
fun(a, 4.0); // I want this to be 4.0
fun(b, 4.0); // I want this to be 6.0
当然,前面的例子在编译时会抛出一个模板重定义错误。
如果 B 是一个函数,我可以重写fun
为这样的:
template <typename T>
T fun(T (f)(T, int), T t) {
return f(t, 2);
}
但我想fun
同时使用函数和可调用对象。使用std::bind
或者std::function
可能会解决问题,但我使用的是 C++98,而这些是在 C++11 中引入的。