具有可变模板参数的函数的模板推导

Template deduction on function with variadic template arguments

我正在尝试编写一种任务图。当我放置新任务时,我希望能够一次添加不同数量的任务并获得一个包含每个添加任务的句柄的元组。

我已经为一项任务编写了一个基本案例,并使用调用该基本案例的可变参数模板参数进行重载。

template<typename Task>
node<Task> emplace(Task&& task) {
  return node<Task>{std::move(task)};
}

template <typename... Tasks, std::enable_if_t<(sizeof...(Tasks) > 1)>>
auto emplace(Tasks&&... tasks) {
  return std::make_tuple(emplace(std::forward<Tasks>(tasks))...);
}

当我现在完成一项任务时

emplace([](){ something cool; });

我没有收到任何错误,但是当我添加两个或更多任务时

emplace(
  [](){ task a; },
  [](){ task b; }
);

我收到一条错误消息说 template argument deduction/substitution failed

std::enable_if_t<(sizeof...(Tasks) > 1)> 就是 void(当它存在时)。所以你的模板是template <typename... Tasks, void> whatever。所以你有一个类型为 void 的非类型模板参数。祝你匹配成功。

您真正想要的是 typename = std::enable_if_t<(sizeof...(Tasks) > 1)>,一个带有默认值的类型模板参数,它可能会也可能不会被 SFINAEd 输出。