通过代码构造std::array并初始化元素对象
Construct std::array and initialize element objects via code
我想初始化我的数组项,同时避免不必要的实例和副本(类似于这个问题:)。
初始化列表确实适用于少量对象。
由于我的数组有数百个项目,所以我想通过代码片段执行此操作...
我该怎么做?
#include <array>
#include <iostream>
class mytype {
public:
int a;
mytype() : a(0) {}
mytype(int a) : a(a) {}
};
int main() {
// explict constructor calls to instantiate objects does work
std::array<mytype, 2> a = { { mytype(10), mytype(20) } };
std::cout << a[0].a; // 10
// I want to do something like this - what does not work of course
std::array<mytype, 2> b = { { for (i = 0, i++, i < 2) mtype(10 * i); } };
}
这通常使用一对模板来完成:
namespace detail {
template<std::size_t... Idx>
auto make_mytype_array(std::index_sequence<Idx...>) {
return std::array<mytype, sizeof...(Idx)>{{
mytype(10 * Idx)...
}};
}
}
template<std::size_t N>
auto make_mytype_array() {
return detail::make_mytype_array(make_index_sequence<N>{});
}
以上是一对无实用功能,但如果需要可以折叠到class中。如果你需要它的不仅仅是像 10*i
这样的表达式,那么 lambda 可以作为另一个参数传递(模板化为一般的 "callable")。使用复制省略,这将全部崩溃为结果数组对象的直接初始化。
在c++14中:
#include <array>
#include <utility>
#include <cstddef>
template <typename T, std::size_t... Is>
std::array<T, sizeof...(Is)> to_array(std::index_sequence<Is...>)
{
return { T(Is*10)... };
}
template <typename T, std::size_t N>
std::array<T, N> to_array()
{
return to_array<T>(std::make_index_sequence<N>{});
}
int main()
{
std::array<mytype, 10> b(to_array<mytype, 10>());
}
我想初始化我的数组项,同时避免不必要的实例和副本(类似于这个问题:
初始化列表确实适用于少量对象。
由于我的数组有数百个项目,所以我想通过代码片段执行此操作...
我该怎么做?
#include <array>
#include <iostream>
class mytype {
public:
int a;
mytype() : a(0) {}
mytype(int a) : a(a) {}
};
int main() {
// explict constructor calls to instantiate objects does work
std::array<mytype, 2> a = { { mytype(10), mytype(20) } };
std::cout << a[0].a; // 10
// I want to do something like this - what does not work of course
std::array<mytype, 2> b = { { for (i = 0, i++, i < 2) mtype(10 * i); } };
}
这通常使用一对模板来完成:
namespace detail {
template<std::size_t... Idx>
auto make_mytype_array(std::index_sequence<Idx...>) {
return std::array<mytype, sizeof...(Idx)>{{
mytype(10 * Idx)...
}};
}
}
template<std::size_t N>
auto make_mytype_array() {
return detail::make_mytype_array(make_index_sequence<N>{});
}
以上是一对无实用功能,但如果需要可以折叠到class中。如果你需要它的不仅仅是像 10*i
这样的表达式,那么 lambda 可以作为另一个参数传递(模板化为一般的 "callable")。使用复制省略,这将全部崩溃为结果数组对象的直接初始化。
在c++14中:
#include <array>
#include <utility>
#include <cstddef>
template <typename T, std::size_t... Is>
std::array<T, sizeof...(Is)> to_array(std::index_sequence<Is...>)
{
return { T(Is*10)... };
}
template <typename T, std::size_t N>
std::array<T, N> to_array()
{
return to_array<T>(std::make_index_sequence<N>{});
}
int main()
{
std::array<mytype, 10> b(to_array<mytype, 10>());
}