C++26中最简tuple实现方案探讨:能否用简化语法实现?
C++26 基于P2662的最简Tuple实现探讨
你的预想代码目前不可行
你写的T... m这种直接把模板参数包作为结构体成员包的语法,当前C++26(包括已纳入的P2662提案)并不支持。P2662解决的是模板参数包的索引访问问题(比如用Pack[N]获取第N个类型),但没定义类中如何声明对应参数包的成员集合。
基于现有C++26特性的可行最简实现
借助P2662的包索引能力,结合继承方式可以写出简洁的tuple实现,接近原生tuple的行为:
#include <utility> // 用于std::index_sequence和std::make_index_sequence template <typename... T> struct tuple; // 辅助模板,通过继承展开参数包 template <size_t... I, typename... T> struct tuple<std::index_sequence<I...>, T...> : T... {}; // 主模板,生成索引序列并继承 template <typename... T> struct tuple : tuple<std::make_index_sequence<sizeof...(T)>, T...> {}; // 利用P2662的包索引简化get函数 template <size_t N, typename... T> auto& get(tuple<T...>& t) { return static_cast<T[N]&>(t); // P2662允许T[N]直接取参数包第N个类型 } // 使用示例 int main() { tuple<int, float> tup{}; float f = get<1>(tup); }
如果想要更接近你预想的成员访问语法,可以给tuple加一个成员函数版本的get:
template <typename... T> struct tuple : tuple<std::make_index_sequence<sizeof...(T)>, T...> { template <size_t N> auto& get() { return static_cast<T[N]&>(*this); } }; // 使用方式 float f = tup.get<1>();
要实现你预想的语法还需要哪些支持
要写出T... m;和tup.m[1]这种语法,必须等**成员参数包(Member Packs)**相关提案通过:
- 核心提案如P1858R2,它提出允许在类中直接声明成员包(比如
T... m;),并支持通过m[N]直接访问第N个成员 - 还需要配套提案解决成员包的初始化、内存布局、重载解析等细节问题
内容的提问来源于stack exchange,提问作者Jan Schultke
相关产品推荐
相关产品推荐

