我有一个模板来创建各种对象的实例。模板有一个类声明的静态数组,它应该创建一个在创建过程中传递的类类型数组。
在下面的示例中,myclass是类对象的静态数组,大小为200 - 也可以更大。请注意,模板可以使用不同的对象进行实例化 - 因此数组的类型也会相应更改。
如何在声明本身期间初始化静态数组 - 我明白我们需要在定义自己时初始化静态数组,如果大小更大则该怎么办 -
template <class object>
A<object> myclass[200] = { .... new object 200 times...};
或者我需要它来执行新的/删除模板中定义的重载运算符?在这种情况下,对象阵列的构造如何?会发生破坏吗?如果某个对象引用数组,因为它们在模板实例化之前是静态的,该怎么办?
答案 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_sequence
和std::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!"