Долгое время назад я видел нерекурсивную реализацию, чтобы получить последнее значение/тип из последовательности последовательностей/значений типа. Он имеет приятное свойство, что количество созданных шаблонов является независимым (и постоянным) количеством элементов, содержащихся в последовательности.
Реализация прост, как следует
// a struct that eats anything and everything
struct eat { template<class T> eat(T&&) {} };
// generates V matching with U
template<class U, class V> struct match { using type = V; };
template<class... X> struct back_
{
template<class U>
static U&& get(typename match<X, eat>::type..., U&& u)
{
return static_cast<U&&>(u); // forward
}
};
// simple macro to avoid repetition for trailing return type.
#define RETURNS(exp) -> decltype(exp) { return exp; }
// get the last value in meta O(1)
template<class T, class... Ts>
auto back(T&& t, Ts&&... ts) RETURNS( back_<Ts...>::get(static_cast<T&&>(t), static_cast<Ts&&>(ts)...))
Он использует простой факт, что с учетом вариационного типа X...
компилятор может не рекурсивно генерировать другой тип T
, где есть X
.
Итак, я хочу знать, есть ли способ расширить его для реализации функции at_c
или nth
с постоянным количеством экземпляров шаблонов (независимо от количества элементов).
Он также может быть выражен как, дать вариационный тип X...
и некоторое целое число N
, можно ли нерекурсивно генерировать подпоследовательность X...
, состоящую из N
элементов?