使用参数包处理嵌套类以声明std::tuple时遇到编译错误
使用参数包处理嵌套类以声明std::tuple时遇到编译错误
嘿,我来帮你排查这个编译错误的问题~
你遇到的问题核心是误用了折叠表达式的语法,其实这里根本不需要用到折叠表达式,只是参数包展开的写法搞错了。
先看你原来的代码里的问题行:
std::tuple<(typename Structs::T), ...> t;
编译器把(typename Structs::T), ...当成了折叠表达式,但折叠表达式需要一个二元运算符(比如+、*或者特定场景下的逗号运算符)来对参数包元素做累积操作,可你这里只是想把每个Structs对应的T类型依次展开成tuple的模板参数,完全不需要折叠表达式的语法,所以编译器才会报“折叠表达式的操作数没有未展开的参数包”的错误。
修正后的代码
只需要把参数包展开的写法改成标准形式就行,直接在typename Structs::T后面加...,让编译器自动把每个Structs的T类型展开:
#include <tuple> struct A { using T = int; }; struct B { using T = float; }; template <class ... Structs> struct C { std::tuple<typename Structs::T...> t; // 正确的参数包展开写法 }; C<A,B> c; // 现在可以正常编译,c.t的实际类型是std::tuple<int, float>
补充说明
这种简单的类型参数包展开,是C++模板编程里的基础用法:当你需要把参数包中的每个元素对应到某个类型(这里是每个Structs的嵌套T类型),直接在目标类型后面跟上...就可以让编译器自动遍历参数包,把每个元素对应的类型填充进去。折叠表达式是另一种更复杂的用法,用来对参数包的元素执行二元运算的累积,比如计算参数包所有元素的和(args + ...),和你现在的场景完全不匹配哦。
备注:内容来源于stack exchange,提问作者bamia
相关产品推荐
相关产品推荐

