【问题标题】:Initialise large static class array初始化大型静态类数组
【发布时间】:2017-08-20 04:01:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你的最后一段我不太清楚。
  • 为什么你的类需要一个静态数组?我可能会重构该类以接受对某种全局单例对象的引用。
  • 我已按要求更改了问题 - 由于预先确定的数据处理需要静态数组
  • 好的,我想你想要的是一个模板静态变量:stackoverflow.com/questions/1553854/template-static-variable
  • 谢谢 - 链接中有一个答案,我们可以在基类中拥有静态成员数据 - 但是我们如何初始化一个大的静态对象数组

标签: c++ c++11


【解决方案1】:

如何在声明过程中初始化静态数组[?]

如果你想用默认(无参数)构造函数初始化objects,这很容易;像

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!"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多