Если вы можете использовать C ++ 14 (то есть std::make_index_sequence
/ std::index_sequence
), это просто
#include <array>
#include <utility>
template <std::size_t N, std::size_t ... Is>
constexpr std::array<int, N> makeArrayHelper
(std::array<std::pair<int, int>, N> const & r,
std::index_sequence<Is...> const)
{ return {{ r[Is].second - r[Is].first ... }}; }
template <std::size_t N>
constexpr auto makeArray (std::array<std::pair<int, int>, N> const & r)
{ return makeArrayHelper(r, std::make_index_sequence<N>{}); }
int main ()
{
constexpr std::array<int, 2> a
= makeArray<2>({{ {1,3}, {2,9} }}); // a = {2, 7}
constexpr std::array<int, 1> b
= makeArray<1>({{ {5,6} }}); // b = {1}
static_assert( a[0] == 2, "!" );
static_assert( a[1] == 7, "!" );
static_assert( b[0] == 1, "!" );
}
P.s .: Я переименовал makeArray()
функцию, чтобы уменьшить риск конфликта имен с make_array()
в std::experimental