如何在编译期拼接std::initializer_list?
我尝试编写如下代码:
using int_list_t = std::initializer_list<int>; struct ThreeDimensionalBox { static constexpr int_list_t kDims = {1, 2, 3}; }; struct FourDimensionalBox { static constexpr int_list_t kDims = {4, 5, 6, 7}; }; template<typename Box1, typename Box2> struct CombinedBox { static constexpr int_list_t kDims = Box1::kDims + Box2::kDims; // error }; using SevenDimensionalBox = CombinedBox<ThreeDimensionalBox, FourDimensionalBox>;
请问是否存在仅使用std::initializer_list的方案,修正CombinedBox的实现,使SevenDimensionalBox::kDims等效于{1, 2, 3, 4, 5, 6, 7}?我已知可通过带可变整数模板参数的自定义模板类,借助元编程递归技术实现拼接,但想了解仅用std::initializer_list的解决办法。
仅使用std::initializer_list无法实现这个需求,核心原因如下:
标准库未提供拼接支持:
std::initializer_list本身没有重载operator+,也没有内置的拼接方法。要合并两个列表的元素,必须逐个访问元素并生成新的序列,但这一步无法仅靠std::initializer_list完成——它只是元素的视图,不支持修改或合并操作。编译期特性限制:哪怕是
constexpr版本的std::initializer_list,本质也只是指向编译期生成的临时数组的指针和大小的组合。编译期无法将两个独立的底层数组合并成一个新数组,std::initializer_list没有提供这种编译期构造新序列的能力。编译期序列拼接的本质依赖:要在编译期合并整数序列,必须依赖可变模板参数、
std::integer_sequence这类编译期元编程工具——它们能在编译期捕获和操作序列的每个元素。而std::initializer_list只是一种初始化语法的包装,不具备作为编译期序列容器的能力。
如果一定要对外暴露std::initializer_list接口,最终还是要借助你提到的可变模板参数或元编程技术来生成拼接后的初始化列表,无法完全脱离它们仅用std::initializer_list实现需求。
内容的提问来源于stack exchange,提问作者dshin

