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
相关产品推荐
相关产品推荐

