c++ - 具有可变高阶函数的重载分辨率

标签 c++ templates c++11 variadic-templates

假设我有一个可变的高阶函数

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

  1. 为什么会这样?为什么模板参数推导失败?
  2. 如果我从集合中删除 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/

相关文章:

c++ - 全局构造函数的调用顺序是什么

c++ - 将 boost::mpl::find_if 与自定义谓词一起使用

c++ - 奇怪的模板规范

python - 如何在 Django 模板中链接表单?

regex - 为什么 Eclipse 在 Mac OSX 上找不到正则表达式?

c++ - printf 调用搞砸了 std::thread 但 std::cout 很好

c++ double /精度

C++:避免​​在公共(public)接口(interface)中使用特定于库的类型

C++ 模板 : Hint template arguments to compiler?

c++ - 检查 std::function 是否分配给 nullptr