deb*_*g18 4 c++ templates variadic-templates c++17
我试图编写一个函数来转发可变参数模板函数的参数,类似于std::invoke.这是代码:
#include <functional>
template<class... Args>
void f(Args&&... args) { }
template<template<class...> class F, class... Args>
void invoke(F<Args...> f, Args&&... args) {
f(std::forward<decltype(args)>(args)...);
}
int main() {
invoke(f, 1, 2, 3);
std::invoke(f, 1, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)
但是,我invoke和std::invoke编译都失败了.g ++抱怨它无法推断出模板参数template<class ...> class F.那么是否可以在没有显式模板特化的情况下调用可变参数模板函数?
需要注意的是函数模板代表一个家庭的功能.当你说,它传递给它需要解决到一定的功能专业化的模板.我理解您正在尝试使用自定义参数invoke(将函数模板捕获为模板),但遗憾的是,这只适用于类模板,而不是函数模板.
你需要另一层次的间接.即,传递一个将参数转发到的仿函数或lambda f:
invoke([](auto&&... xs) { f(decltype(xs)(xs)...); }, 1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
不同的是,现在参数是一个非模板类,所以它可以由你的推导出来invoke.
通过此更改,您需要更改功能以完全推导出第一个参数:
template<class F, class... Args>
void invoke(F&& f, Args&&... args) {
f(forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)