【发布时间】:2018-04-09 18:52:24
【问题描述】:
例如,给定以下代码
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 中引入的。
【问题讨论】:
-
这不可能。单个可调用对象可以有多个签名(例如重载的
operator())。 -
类似的东西在 C++ 中是可能的>=11 但 98 似乎太弱了。
-
我认为this question 正在完成类似的事情,但我发现代码太混乱了。 @n.m。我真的不明白具有多个签名的可调用对象如何影响模板推导。
-
链接的答案基于 sizeof(value-returned-by-call),当目标函数返回 void 时,它会崩溃。但是,如果这对您不重要,则可以使用这种方法。
-
等等,我想我有办法了,等等……
标签: templates overloading c++98 method-signature callable-object