You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否向C++可变参数模板传递花括号初始化列表?

关于可变参数模板函数接收花括号初始化列表的问题

我希望将可变数量的对象以花括号初始化列表的形式传递给模板函数,示例代码如下:

enum class E { a, b, c };

template <typename T>
struct Info
{
    template <typename U>
    Info(E e, U u)
        : e(e)
        , size(sizeof(u))
    {}

    E e;
    size_t size;
};

template <typename...Ts>
void fn(Info<Ts>&&...args) { }

int f() {
    fn({ E::a, 5 });
}

当改用具体类型时,花括号初始化列表可正常工作:

enum class E { a, b, c };

struct InfoBase { E e; int size; };

void f1(InfoBase&& a, InfoBase&& b) { }

void f() {
    f1({ E::a, 4 }, { E::b, 6 });
}

但将f1替换为以下可变参数模板版本时调用失败:

void f1() { }

template <typename...Ts>
void f1(InfoBase&& a, Ts&&...args)
{
    f1(std::forward<Ts>(args)...);
}

错误信息如下:

<source>: In function 'void f()':
<source>:22:7: error: no matching function for call to 'f1(<brace-enclosed initializer list>, <brace-enclosed initializer list>)'
   22 |     f1( { E::a, 4 }, { E::b, 6 } );
      |     ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:16:6: note: candidate: 'void f1(InfoBase&&, Ts&& ...) [with Ts = {}]'
   16 | void f1(InfoBase&& a, Ts&&...args) {
      |      ^~
<source>:16:6: note:   candidate expects 1 argument, 2 provided
<source>:14:6: note: candidate: 'void f1()'
   14 | void f1() { }
      |      ^~
<source>:14:6: note:   candidate expects 0 arguments, 2 provided

我认为是由于Ts没有可绑定的具体类型导致推导失败,即使调用链后续有相关信息也无法完成推导,该判断是否正确?我所尝试的实现方式是否不可行?


内容的提问来源于stack exchange,提问作者Adrian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:25:20