【发布时间】:2015-07-15 20:38:59
【问题描述】:
考虑一下这个网站上存在很多变体的简单(坏)函数模板:
template <typename R, typename... Args>
R call_with(std::function<R(Args...)> f,
Args... args)
{
return f(args...);
}
两次尝试调用它:
call_with([]{}); // (a)
call_with<void>([]{}); // (b)
我无法调用 (a),因为 lambda 不是 std::function<R(Args...)>,因此模板推导失败。直截了当。
但是,(b) 也失败了。我怀疑这是因为编译器无法确定我的意思是提供 all 我只是提供 R 的类型参数和原因 - 所以它正在尝试(并且失败)推断 Args... 为与初始调用失败的原因相同。
有没有办法明确指定我提供所有模板参数?为了澄清,我仅对如何显式提供模板参数感兴趣,以便没有模板推导 - 我不是在寻找正确的写法 call_with 或制作模板的方法使用 lambda 调用时,演绎成功。
【问题讨论】:
-
即使我提供参数,我也会看到失败:coliru.stacked-crooked.com/a/7d2e89a69f8d738d
-
@JayMiller 对,同样的想法。尽管如果我们重写
call_with以始终采用单个参数 (template <typename R, typename A> R call_with(std::function<R(A)>, A );),那么显式提供模板参数就可以正常工作 (call_with<void, int>([](int ){}, 42);)。固执的只是参数包的情况。 -
我不应该删除我之前的评论,这让@Barry 澄清这不是关于如何解决这个问题的问题,而被问到的问题正是如所写。 “有没有办法明确指定...”
标签: c++ templates c++11 template-argument-deduction