c++ - 在没有默认构造函数的类类型的 #define 中初始化大小的非静态成员数组

标签 c++ arrays constructor

我有以下类(class):

//in some .h file
#define BARS_IN_FOO 5 //The only place where this number should be specified.
//All code should work when I change this

//in some .cpp file
struct Foo;
struct Bar { Foo & foo; Bar(Foo & foo) : foo{ foo } {} } //Cannot be default initialized

struct Foo {
    std::array<Bar, BARS_IN_FOO> myBars;
    Foo() :
        myBars{ } //Error. Cannot default initialize Bars.
    //I want to initialize all Bars with Bar{*this} but at this point I don't
    //know how many Bar initializers I should put in the myBar initializer list
    {}
}

那我应该怎么初始化Foo::myBars呢? ?数量Bar s 在编译时是已知的,但我只想在一个地方指定这个数字(最好在定义中,欢迎其他建议)。

Foo::mybars 的用法:

  • 它的大小在运行时永远不会改变,但我还没有决定数字是多少,但会在 [1..10](左右)范围内的某个地方(在开发过程中数字可能会发生很大变化)。
  • 元素值永远不会改变 (总是相同的非常量对象)。
  • Foo 之间的关系和 Bar是构图。 FooBar 制成s 和他们的生命周期是一样的。 Bar没有 Foo反之亦然。
  • FooBar类是性能关键代码的一部分,它们的大小会极大地影响程序的内存占用(80-90% 的内存占用将是 Foo s 和 Bar s)。

编译器:MSVS2017 版本 15.3

编辑:更改 std::array<Bar, BARS_IN_FOO> myBars;Bar myBars[BARS_IN_FOO];如果有帮助也可以。

重要编辑:Bar 的所有 Actor 和 Foo是公开的。这是一个错误。我改变了这个。

最佳答案

如果您可以假设Bar,您就可以很容易地做到这一点可移动/可复制:

template <std::size_t ... Is>
std::array<Bar, sizeof...(Is)> make_bar_array_impl(Foo& f, std::index_sequence<Is...>) {
    return { (Is, f)... };
}

template <std::size_t N>
std::array<Bar, N> make_bar_array(Foo& f) {
    return make_bar_array_impl(f, std::make_index_sequence<N>{});
}

Foo() : myBars(make_bar_array<BARS_IN_FOO>(*this)) {}

这可以很容易地重构为使用更通用的模板元编程实用程序“重复”。我怀疑任何模板元编程库都会有一些这样的实用程序,在这里我不费心去分解它,因为它无论如何都是一个衬里。但是,如果您经常遇到此类问题,则需要考虑(只需编写一个返回 N 项初始化列表的函数,所有这些列表都具有相同的表达式)。

实例:http://coliru.stacked-crooked.com/a/aab004c0090cc144 .抱歉,无法轻松访问 MSVC 编译器。也用 14 编译,因为我不需要任何 17 功能。

编辑:即使Bar不可移动/不可复制,或者如果您认为事情不会得到优化,实际上可以修改此技术以在这种情况下工作。您可以生成 array<std::reference_wrapper<Foo>, N反而。但这有点复杂,通常在 C++ 中,大多数东西应该是可移动的,而且通常构造函数调用不在关键路径中。如有必要,我仍然可以详细说明。

Edit2:另外,请不要为此使用#define。 constexpr static auto BARS_IN_FOO = 5;应该以完全相同的方式工作,除了它具有正确的命名空间(可能还有一些我忘记的其他宏指令)。

关于c++ - 在没有默认构造函数的类类型的 #define 中初始化大小的非静态成员数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45799111/

相关文章:

c++ - 动态内存分配,堆,间接,NULL

C++将整数数组分成 block

c - 传递数组而不是指向 C 中函数的指针

arrays - Ruby String Split on "\t"丢失 "\n"

c++ - 当通过成员函数将文字传递给构造函数时,为什么没有将值分配给类的成员?

c++ - 有什么建议可以精确地制作以下 c++ 代码吗?

c++ - 程序在服务器上相互瘫痪(c++ with openMP and python)

c++ - 如何 "concatenate"boost::mpl::vectors

C#:构造函数中的奇怪引用的行为类似于 "virtual field"

c++ - Visual Studio 2010 不会自动链接来自依赖项的项目中的静态库,因为它应该是