使用从1到N的数字初始化std数组模板参数
Initialize std array with numbers from 1-to N template argument
我有一个模板类,想用参数中指定的从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
相关文章:
- 初始化具有非默认构造函数的std::数组项的更好方法
- 如何在旧c++中初始化const-std向量
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 为什么std::vector和std::valarray初始化构造函数不同
- 使用通用值初始化 std::map,不重复
- std::initializer_list,大括号初始化和标头
- 标准::unordered_map 中的 std::array 的值初始化
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 初始化 std::vector 替换为单大括号而不是双大括号
- 包含 std::list 的结构体的 C++ 初始化
- 在构造函数中使用可变参数初始化 std::tuple
- 使用 std::分配器在 constexpr 中进行默认初始化
- 使用大括号初始化 std::vector 使用初始值设定项列表
- 为什么初始化 std::vector 时不能使用模板整数?
- 使用 std::ios_base::Init 正确初始化全局变量
- 如何在构造函数参数中初始化"std::set"?
- 初始化 std::数组 of Eigen::Map
- C++ - std::构造函数中的矢量初始化
- C STD ::初始化类对象中的Alloc错误错误
- std::初始化列表中的数组初始值设定项列表初始化