在下面的代码中,我旨在构造一个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;
}
答案 0 :(得分:3)
如果您可以使用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 :(得分:1)
您可以简单地执行循环:
std::vector<std::string>
自C ++ 17起,可能是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;
}
。