考虑这个简单的(坏的)函数模板,这个网站上存在很多变体:
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)
也失败了。我怀疑这是因为编译器无法确定我的意思是提供我只是提供的所有R
类型参数和原因- 所以它正在尝试(并且失败)推断Args...
初始调用失败的相同原因。
有没有办法明确指定我提供所有模板参数?澄清一下,我只对如何显式提供模板参数感兴趣,以便没有模板推导 - 我不是在寻找正确的编写方法call_with
或在使用 lambda 调用时使模板推导成功的方法。