c++ - 如何推断可变参数之后的模板参数?

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

我有以下模板函数:

template <typename...Args, typename Func>
void call(const char *name, Args...args, Func f)
{
        f(3);
}

当我尝试使用它时,比如

    call("test", 1, 2, 3, [=](int i) { std::cout<< i; });

编译器提示它无法推断模板参数 Func。 知道 args 可以是函数指针以外的任何类型,如何解决这个问题。

最佳答案

从 14.1p11 开始:

A template parameter pack of a function template shall not be followed by another template parameter unless that template parameter can be deduced from the parameter-type-list of the function template or has a default argument (14.8.2).

如果你想将可调用对象保留为最后一个参数,你可以使用 forward_as_tuple :

template <typename...Args, typename Func>
void call(const char *name, std::tuple<Args...> args, Func f)
{
        f(3);
}

call("test", std::forward_as_tuple(1, 2, 3), [=](int i) { std::cout<< i; });

实际上,我们可以通过合成 元组 来包含可调用对象,从而做得更好:

#include <tuple>

template<typename... Args_F>
void call_impl(const char *name, std::tuple<Args_F... &&> args_f) {
   auto &&f = std::get<sizeof...(Args_F) - 1>(args_f);
   f(3);
}

template<typename...ArgsF>
void call(const char *name, ArgsF &&...args_f) {
   call_impl(name, std::tuple<ArgsF &&...>(std::forward<ArgsF>(args_f)...));
}

关于c++ - 如何推断可变参数之后的模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15977656/

相关文章:

c++ - 从类型名称列表中提取 C++ 变体类型

java - 什么相当于 java 中的 fopen_s()?

c++ - C++ 中的无范围枚举、枚举器和底层类型歧义

c++ - Boost::geometry 查询返回索引

c++ - 部分模板特化 - 将类型作为参数传递?

c++ - 通过链表类从 main 中的另一个类调用函数

c++ - C++ 项目和库的正确结构

c++ - 将变量的名称传递给 C++ 中的函数

c++ - 无法将 std::chrono 与 std::future 一起使用 - 未找到 GLIBCXX_3.4.19

Python 和 Jinja2 - 导入另一个环境的模板