初始化大型静态类数组

时间:2017-08-20 04:01:03

标签: c++ c++11

我有一个模板来创建各种对象的实例。模板有一个类声明的静态数组,它应该创建一个在创建过程中传递的类类型数组。

在下面的示例中,myclass是类对象的静态数组,大小为200 - 也可以更大。请注意,模板可以使用不同的对象进行实例化 - 因此数组的类型也会相应更改。

如何在声明本身期间初始化静态数组 - 我明白我们需要在定义自己时初始化静态数组,如果大小更大则该怎么办 -

template <class object>
A<object> myclass[200] = { .... new object 200 times...};

或者我需要它来执行新的/删除模板中定义的重载运算符?在这种情况下,对象阵列的构造如何?会发生破坏吗?如果某个对象引用数组,因为它们在模板实例化之前是静态的,该怎么办?

1 个答案:

答案 0 :(得分:0)

  

如何在声明本身[?]

期间初始化静态数组

如果要使用默认(无参数)构造函数初始化object s,则很容易;

之类的东西
template <class object>
object A<object>::myclass[200] { };

以下是完整(简化)示例

#include <iostream>

template <typename T, std::size_t Dim>
struct foo : public T 
 { static T const myArray[Dim]; };

template <typename T, std::size_t Dim>
T const foo<T, Dim>::myArray[Dim] { };

struct bar
 { bar () { std::cout << "bar! " << std::endl; } };

int main ()
 { (void)foo<bar, 10>::myArray; } // print 10 times "bar!"

如果你想用不同的构造函数初始化它......它有点复杂。

以下是一个C ++ 14示例(使用std::index_sequencestd::make_index_sequence;但在C ++ 11中,如果需要,它们并不是很难替代使用部分特化,模板默认值,可变参数解包和逗号运算符

#include <utility>
#include <iostream>

template <typename T, std::size_t Dim,
          typename U = decltype(std::make_index_sequence<Dim>{})>
struct foo;

template <typename T, std::size_t Dim, std::size_t ... Is>
struct foo<T, Dim, std::index_sequence<Is...>>
 { static T const myArray[Dim]; };

template <typename T, std::size_t Dim, std::size_t ... Is>
T const foo<T, Dim, std::index_sequence<Is...>>::myArray[Dim]
    { ((void)Is, T(1))... };

struct bar
 { bar (int) { std::cout << "bar! " << std::endl; } };

int main ()
 { (void)foo<bar, 10>::myArray; } // print 10 times "bar!"