Лучшее, что я могу себе представить, это разработать заменитель C ++ 11 для std::index_sequence
и std::make_index_sequence
и применить решение C ++ 14, которое вы связали.
Но если этого избежать, вы можете использовать рекурсию.
Дать самодельную целочисленную последовательность
template <typename T, T...>
struct myIntegerSequence
{ };
и вспомогательную структуру mot_h
("make output templatehelper ")
template <typename T, T, std::size_t, typename>
struct mot_h;
// recursive version
template <typename T, std::size_t N, const T(&A)[N], std::size_t Pos, T ... ts>
struct mot_h<const T(&)[N], A, Pos, myIntegerSequence<T, ts...>>
: mot_h<const T(&)[N], A, Pos+1u, myIntegerSequence<T, ts..., A[Pos]>>
{ };
// ground case
template <typename T, std::size_t N, const T(&A)[N], T ... ts>
struct mot_h<const T(&)[N], A, N, myIntegerSequence<T, ts...>>
{ using type = myIntegerSequence<T, ts...>; };
вы можете написать следующий шаблон output
template <typename T, T inp>
using output = typename mot_h<T, inp, 0u,
myIntegerSequence<
typename std::remove_const<
typename std::remove_reference<decltype(inp[0])>::type>::type>
>::type;
Ниже приведен пример полной компиляции C ++ 11
#include <type_traits>
template <typename T, T...>
struct myIntegerSequence
{ };
constexpr int input[] = { 2, 3, 5, 7, 11, 13, 17, 19 };
template <std::size_t N, typename T, const T (&A)[N]>
struct foo
{ };
template <typename T, T, std::size_t, typename>
struct mot_h;
template <typename T, std::size_t N, const T(&A)[N], std::size_t Pos, T ... ts>
struct mot_h<const T(&)[N], A, Pos, myIntegerSequence<T, ts...>>
: mot_h<const T(&)[N], A, Pos+1u, myIntegerSequence<T, ts..., A[Pos]>>
{ };
template <typename T, std::size_t N, const T(&A)[N], T ... ts>
struct mot_h<const T(&)[N], A, N, myIntegerSequence<T, ts...>>
{ using type = myIntegerSequence<T, ts...>; };
template <typename T, T inp>
using output = typename mot_h<T, inp, 0u,
myIntegerSequence<
typename std::remove_const<
typename std::remove_reference<decltype(inp[0])>::type>::type>
>::type;
int main ()
{
using target = myIntegerSequence<int, 2, 3, 5, 7, 11, 13, 17, 19>;
static_assert( std::is_same<output<decltype((input)), input>,
target>::value, "!" );
}