【发布时间】:2014-05-06 16:46:18
【问题描述】:
假设我有一个可变高阶函数
template<typename F, typename ...Args>
void execution(F func, Args&&... args)
{
func(std::forward<Args>(args)...);
}
那么对于这个重载集
void f() {}
void f(int arg) {}
重载分辨率为impossible
int main()
{
execution(f, 1);
execution(f);
return 0;
}
然而,如果只提供两者之一,程序compiles
- 为什么会发生这种情况?为什么模板参数推导失败?
-
如果我从集合中删除
f()并将其替换为f(arg, arg2),则仍然是 problem。是否有解决方法,或者 我是否总是必须将函数的 provide the type 作为模板参数?execution<void()>(f);
【问题讨论】:
-
有 C++ Jon Skeet 吗?
-
这首先是模板参数推导的问题,而不是重载解析的问题。
-
C++1y的解决方案是写
execution([](auto&&... pp){ return f(std::forward<decltype(pp)>(pp)...); });。这是一个已知问题,我猜这个问题有多个重复项。
标签: c++ templates c++11 variadic-templates