本文主要是介绍2402C++,C++26包索引,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原文
新的索引式访问方式
当前,要定义一个参数包变量
,需要借助std::tuple
;要索引式访问参数包元素
,需要借助std::get
和std::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>();
}
该实现元组
的方式借助了包索引
和变量包
(尚未入标准),它比ReflectionforC++
中介绍的反射方式还要直接了当
,是最简洁
的实现方式.
语法解析
深思熟虑过后,最终包索引
的语法为:
包名 ... [常表达式]
这样可直接访问指定位置的参数包,示例:
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 );
T...[N]
针对的是类型
,而values...[N]
针对的是值
.参数包的首位元素
加末位元素
,返回一个编译期常量值
.
尚未完善
虽然包索引
已进C++
,但还未完善.更多见原文!
这篇关于2402C++,C++26包索引的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!