【发布时间】:2017-10-15 01:51:33
【问题描述】:
我了解模板无法从赋值中推断出类型,即
template <typename T>
T aFunction (int a) { /*...*/ }; // This obviously won't work
原因很明显。但这会工作:
template <typename T>
T aFunction (T a, T b) { return a + b; }; // a-ok
'因为 T 将从参数中推断出来。我想从中推断:
template <typename T>
T aFunction (std::function<T(int)> a) { return a(3);};
^
|
I specified it! ----------
这样在使用时,函数应该做什么就没有歧义了:
std::function<double(int)> blah = [](int x){ return x / 2.0f; };
aFunction(blah);
唉,编译器不配合我了:
没有匹配的成员函数调用'aFunction'
候选模板被忽略:无法匹配 'function' 对 '(lambda at 文件.hpp:274:16)'
有没有办法做到这一点?缺少模板专业化(这是一个非常泛型类),或者一个虚拟参数(我还没有那么绝望)。
警察局:
完全披露:以上只是对问题的简化,我真正需要的是:
template <typename T>
class MyStuff {
template <typename ReturnType>
MyStuff<ReturnType> aFunction(std::function<ReturnType(T)> a){
/*for each stuff in MyStuff do a(stuff)*/
}
}
其中MyStuff 包含T 类型的属性和一堆inline 函数,例如aFunction。
【问题讨论】:
-
template关键字发生了什么? -
“编译器不配合我”是什么意思?有任何错误信息吗?
-
遗憾的是,我无法重现(它确实有效):coliru.stacked-crooked.com/a/f4ebbfb5e9f594fa
-
我的猜测是您使用 lambda 直接调用而不将其嵌入到某处的
std::function中(未显示在您的问题中):您不能同时使用模板参数推导和隐式转换同时 -
@whitelionV 恕我直言,您不必删除它。这是一个有趣的问题。你的问题让我测试,我只知道模板推导可以因此而广泛使用。您唯一错过的是提供完整的 mcve,这还不错,因为您已经提供了一个很好的小 sn-p。