我有一个模板类,想用参数中指定的从1
到N
的数字初始化它的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