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

C++参数包展开调用函数时‘无参数包’编译错误的解决问询

问题:调用接收任意数量参数的函数,每个参数由get()生成

需要实现一个类,调用类T的doSomething方法,该方法所需的参数对象构造时需要N个参数,每个参数都由get()函数提供。写出的C++代码如下:

template <typename T, std::size_t N>
class MyClass
{
public:
    void doSomething()
    {
        doSomethingProxy(std::make_index_sequence<N>());
    }

private:
    template <std::size_t... I>
    void doSomethingProxy(std::index_sequence<I...>)
    {
        m_obj.doSomething({get()...}); // T::doSomething() 需要一个构造函数带N个参数的对象,希望调用N次get()来生成每个参数
    }
    
    int get() { return 0; }

    T m_obj{};
};

编译时出现错误:

error: expansion pattern get() contains no parameter packs

你猜测的问题点是对的:get()...没有依赖参数包I,C++规定参数包展开的模式必须和参数包元素相关联,否则编译器无法确定要展开多少次。

解决方法

修改doSomethingProxy函数,利用逗号表达式让get()的展开关联到参数包I:

template <std::size_t... I>
void doSomethingProxy(std::index_sequence<I...>)
{
    m_obj.doSomething({(static_cast<void>(I), get())...});
}

原理说明

  • static_cast<void>(I):无意义的操作,唯一作用是使用参数包中的每个元素I,让编译器识别出这是和参数包关联的展开模式
  • 逗号表达式会先执行左边的无操作语句,然后返回右边get()的结果,最终展开后会生成N个get()调用,正好对应目标对象构造所需的N个参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:02:15