使用从1到N的数字初始化std数组模板参数



我有一个模板类,想用参数中指定的从1N的数字初始化它的std::array。如何做到这一点?

#include <iostream>
#include <array>
template<unsigned int N>
class Jollo
{
private:
std::array<int,N> deck;
public:
Jollo()
{
static_assert(N>1,"Jollo: deck size must be higher than '1'");
deck = std::array<int,N>{1...N}; //how to do this? = {1,2,4,5,6,7,8,9,10,11,12,13,14,15}
}
};
int main()
{
Jollo<15> j;
return 0;
}

std::iota就是您想要的:

Jollo()
{
static_assert(N>1,"Jollo: deck size must be higher than '1'");
std::iota(deck.begin(), deck.end(), 1); // fills array from 1 to N
}

如果需要constexpr,我会选择循环,因为iota还没有标记为constexpr:

constexpr Jollo()
{
static_assert(N>1,"Jollo: deck size must be higher than '1'");
for (int i = 0 ; i < N ; ++i) {
deck[i] = i + 1;
}
}

您可以创建一个make_array函数模板,该模板将根据您的需求返回所需的std::array和元素,如下所示。请注意,仅出于调试目的,我已将deck公开,如果需要,您可以将其更改回private

C++11版本

template<std::size_t N> std::array<int, N> make_array()
{
std::array<int, N> tempArray{};
int count = 0;
for(int &elem:tempArray)
{
elem = ++count;
}
return tempArray;
}
template<unsigned int N>
class Jollo
{
public:
std::array<int,N> deck; //for debugging purposes i made this public, you can change it back
public:
//-----------vvvvvvvvvvvvvvvvvvvvv--->use member initializer list
Jollo(): deck(make_array<N>())
{
static_assert(N>1,"Jollo: deck size must be higher than '1'");

}
};
int main()
{
Jollo<15> j;

//lets confirm if all objects have the expected value 
for(const auto &elem: j.deck)
{
std::cout << elem << std::endl; 
}

}

工作演示C++11

上述程序的输出为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

C++17版本

使用C++17,您可以在编译时(如果需要(完成所有这些操作,如下所示。功能模板make_array已制成consexpr

//-----------------------------------------VVVVVVVVV---------->constexpr added 
template<std::size_t N> std::array<int, N> constexpr make_array()
{
std::array<int, N> tempArray{};
int count = 0;
for(int &elem:tempArray)
{
elem = ++count;
}
return tempArray;
}
template<unsigned int N>
class Jollo
{
public:
std::array<int,N> deck; 
public:
//--vvvvvvvvv---------------------->constexpr added 
constexpr Jollo(): deck(make_array<N>())
{
static_assert(N>1,"Jollo: deck size must be higher than '1'");

}
};
int main()
{
constexpr Jollo<15> j;

//lets confirm if all objects have the expected value 
for(const auto &elem: j.deck)
{
std::cout << elem << std::endl; 
}

}

工作演示C++17

最新更新