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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:50:12