Вычислить различия парных элементов в массиве пар время компиляции - PullRequest
2 голосов
/ 02 мая 2019

В приведенном ниже коде я собираюсь создать массив из N элементов, который содержит различия между двумя std::pair элементами времени компиляции.Есть ли способ добиться этого с помощью шаблонов, так как он должен работать для произвольного размера N?

#include <array>
#include <utility>

template<int N>
std::array<int, N> make_array(
        const std::array<std::pair<int, int>, N>& ranges)
{
    // Need to construct array compile time with difference between pair elements.
}

int main()
{
    std::array<int, 2> a = make_array<2>({{ {1,3}, {2,9} }}); // a = {2, 7}
    std::array<int, 1> b = make_array<1>({{ {5,6} }}); // b = {1}

    return 0;
}

Ответы [ 2 ]

3 голосов
/ 02 мая 2019

Если вы можете использовать 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

1 голос
/ 02 мая 2019

Вы можете просто сделать цикл:

template <std::size_t N>
constexpr std::array<int, N> make_array(
        const std::array<std::pair<int, int>, N>& ranges)
{
    std::array<int, N> res{};

    for (std::size_t i = 0; i != N; ++i) {
        res[i] = ranges[i].second - ranges[i].first;
    }
    return res;
}

Это может быть constexpr начиная с C ++ 17.

Демо

...