假设我有一个可变的高阶函数
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);
最佳答案
在进行模板类型推导时,编译器不会分析函数内部如何使用类型。因此,在推导模板参数时,编译器看不到不同模板参数之间的关系。因此,额外的可变模板参数根本不重要,问题可以简化为
template<typename Func> void execution(Func func);
void f();
void f(int);
execution(f);
有了这个最小化的代码,模板参数推导失败的原因就很明显了。
您可以通过使第一个参数显式依赖于其余模板参数来解决此问题,例如:
template<typename... Args>
void execution(void (*func)(Args ...), Args ... args)
{
func(std::forward<Args>(args) ...);
}
关于c++ - 具有可变高阶函数的重载分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23455055/