当前位置:   article > 正文

2402C++,C++26包索引

2402C++,C++26包索引

原文

新的索引式访问方式

当前,要定义一个参数包变量,需要借助std::tuple;要索引式访问参数包元素,需要借助std::getstd::tuple_element;要解包,需要借助std::apply.
而借助这些新的特性,以后可直接写出此代码:

template <typename... Ts>
class Tuple {
public:
    constexpr Tuple(Ts&&... ts)
        : elems(std::forward<Ts>(ts))...
    { }
    template <size_t I>
    auto get() const&-> Ts...[I] const& {
        return elems...[I]; //包索引
    }
private:
    Ts... elems; //可变包
};
template <size_t I, typename... Ts>
struct std::tuple_element<I,Tuple<Ts...>>{
    using type = Ts...[I]; //包索引
};
int main() {
    Tuple<int, char> tup(1, 'c');
    return tup.get<0>();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

该实现元组的方式借助了包索引变量包(尚未入标准),它比ReflectionforC++中介绍的反射方式还要直接了当,是最简洁的实现方式.

语法解析

深思熟虑过后,最终包索引的语法为:

包名 ... [常表达式]
  • 1

这样可直接访问指定位置的参数包,示例:

template <typename... T>
constexpr auto first_plus_last(T... values) -> T...[0] {
    return T...[0](values...[0] + values...[sizeof...(values)-1]);
}
static_assert(first_plus_last(1,2,10) ==11 );
  • 1
  • 2
  • 3
  • 4
  • 5

T...[N]针对的是类型,而values...[N]针对的是.参数包的首位元素末位元素,返回一个编译期常量值.

尚未完善
虽然包索引已进C++,但还未完善.更多见原文!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/111243
推荐阅读
相关标签
  

闽ICP备14008679号