原文
新的索引式访问方式
当前,要定义一个参数包变量,需要借助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++,但还未完善.更多见原文!