对std::array中的元素调用用户定义的构造函数
Call user defined constructor on elements in std::array
我有一个简单的例子,我创建了一些Foo元素的std::array
:
struct Foo
{
Foo(int bar=0) : m_bar(bar)
{
// Code depending on the value of bar
}
int m_bar;
};
const unsigned int num = // get array size
std::array<Foo, num> fooArr;
当我在构造函数m_bar(bar)
中使用初始化器列表时,这将所有Foo.m_bar
设置为0
(因为这是默认的构造函数参数值)。如果我不这样做,那么它就充满了垃圾值。
我的问题是,我如何在不知道数组大小之前传递另一个值不同于默认值到数组中每个元素的构造函数?
我尝试在创建数组时使用init列表,如:std::array<Foo, 5> fooArr{3}
,但这只会将第一个元素的m_bar
设置为3
。
您应该简单地默认构造std::array
,然后使用它的fill
方法用固定值填充它。许多编译器可以有效地优化这一点,因此您不必为"额外的"初始化付出代价。
为了满足您的用例,代码看起来像这样:
fooArr.fill(Foo(3));
制作包含N个元素的integer_sequence
,并使用包扩展构建数组。如果你的默认构造函数做的是很重要的工作,或者它不存在,这将更有用。
template<std::size_t N, class T, std::size_t... Ns>
std::array<T, N> make_repeating_array(const T& value, std::index_sequence<Ns...>) {
return {(void(Ns), value)... };
}
template<std::size_t N, class T>
std::array<T, N> make_repeating_array(const T& value) {
return make_repeating_array<N>(value, std::make_index_sequence<N>());
}
使用
std::array<Foo, num> fooArr = make_repeating_array<num>(Foo(5));
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- Visual C++(VS2017)中用户定义的转换不明确
- 使用用户定义的参数调用future/async并调用类方法
- 带有用户定义类的c++折叠表达式
- g++用户定义的动态链接库上的全局new和delete运算符
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 修改"std::set"中用户定义类型的值
- 参数包构造函数在类模板中隐藏用户定义的转换
- MAKE:找不到包含的用户定义的头文件?
- C++:用户定义的显式类型转换函数错误
- 从用户定义的类生成格式字符串?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- C++ 向量与用户定义的类比较?(==, <, >)
- STL 用户定义的二进制操作
- 将用户定义的类型与 std::vector 和 std::sort 一起使用
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 使用宏编译时使用用户定义的数学函数,或者仅使用 c++ 中标准数学库中的函数
- C++:用户定义的类,以成员字段作为地址