gpt4 book ai didi

c++ - 是否可以在没有显式特化的情况下调用可变参数模板函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:34 24 4
gpt4 key购买 nike

我正在尝试编写一个函数来为可变参数模板函数转发参数,类似于 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);
}

但是,我的invokestd::invoke无法编译。g++ 提示它无法推断模板参数 template<class ...> class F .那么是否可以在没有显式模板特化的情况下调用可变参数模板函数?

最佳答案

请注意,一个函数模板代表一个函数族。例如,当您将它传递给需要解析为模板的特定特化 的函数时。我了解您要对自定义 invoke 的参数执行的操作(将函数模板捕获为模板),但遗憾的是,这仅适用于类模板,不适用于函数模板。

您需要另一个间接级别。即,传递将参数转发给 f 的仿函数或 lambda:

invoke([](auto&&... xs) { f(decltype(xs)(xs)...); }, 1, 2, 3);

区别在于现在参数是一个非模板类,因此它可以通过您的调用推导出来。

此更改带来了额外的要求,即您更改函数以完全推导第一个参数:

template<class F, class... Args>
void invoke(F&& f, Args&&... args) {
f(forward<Args>(args)...);
}

关于c++ - 是否可以在没有显式特化的情况下调用可变参数模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50172093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com