Вот решение, совместимое с C ++ 14.
Уловка, чтобы "передать" constexpr std::array
(или любой другой объект структуры / класса) в качестве аргумента шаблона, заключается в том, чтобы заключить его в тип:
constexpr std::array<int,3> a{7,15,28};
struct ArrayWrapper_a {
static constexpr auto& value = a;
};
template<typename ArrayWrapper>
struct Foobar {
// do stuff with ArrayWrapper::value
}
Затем вы можете сделать что-то похожее на ответ BeeOnRope, чтобы сгенерировать последовательности:
template<typename ArrayWrapper, typename Sequence>
struct array_to_sequence_impl;
template<typename ArrayWrapper, std::size_t... indices>
struct array_to_sequence_impl<ArrayWrapper,std::index_sequence<indices...>> {
using value_type = typename std::decay_t<decltype(ArrayWrapper::value)>::value_type;
using type = std::integer_sequence<value_type, std::get<indices>(ArrayWrapper::value)...>;
};
template<typename ArrayWrapper>
using array_to_sequence = typename array_to_sequence_impl<ArrayWrapper,std::make_index_sequence<ArrayWrapper::value.size()>>::type;
Использование:
constexpr std::array<int,3> a{7,15,28};
struct ArrayWrapper_a {
static constexpr auto& value = a;
};
using Sequence_a = array_to_sequence<ArrayWrapper_a>;
Живая демоверсия