1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#pragma once
namespace saw {
template <class T, class... TL> struct parameter_pack_index;
template <class T, class... TL> struct parameter_pack_index<T, T, TL...> {
static constexpr size_t value = 0u;
};
template <class T, class TL0, class... TL>
struct parameter_pack_index<T, TL0, TL...> {
static constexpr size_t value =
1u + parameter_pack_index<T, TL...>::value;
};
template <size_t N, class... T> struct parameter_pack_type;
template <class TN, class... T> struct parameter_pack_type<0, TN, T...> {
using type = TN;
};
template <size_t N, class TN, class... T>
struct parameter_pack_type<N, TN, T...> {
static_assert(sizeof...(T) > 0, "Exhausted parameters");
using type = typename parameter_pack_type<N - 1, T...>::type;
};
}
|