我有以下模板函数:
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/