赞
踩
当前,要定义一个参数包变量
,需要借助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++
,但还未完善.更多见原文!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。