【发布时间】:2020-09-09 22:50:20
【问题描述】:
我在一个内存受限的系统上工作,其中 new/malloc 调用在构建时被包装以失败。因此,很遗憾,std::vector 不是一个可接受的解决方案。
我有一个类的 std::array 成员,其大小在编译时已知,但在特定目标之间可能会有所不同(例如,来自配置文件),因此我可以访问类似 constexpr size_t len = Config::ArrSize 的内容。我希望我的班级拥有std::array 的对象,但这些对象没有默认构造函数。我更愿意避免两步初始化(例如,实现一个毫无意义的默认 ctor,然后稍后传递它们的实际值)。我也知道编译时的所有构造函数值!我只是找不到一种干净的方式来传达这一点,因为 length 可能在特定目标之间有所不同,但对于任何 given garget 都是已知的。
有没有办法清晰地传达这一点?例如我想要类似的东西
#include Config.h
constexpr size_t arr_size = Config::ArrSize;
constexpr size_t ctor_arg = Config::Arg;
class Foo {
public:
// line which doesn't work but demonstrates what I'd like
Foo() : fooArr {Bar(ctor_arg)} {}
private:
std::array<Bar, arr_size> fooArr;
};
它们都将以相同的方式初始化,并且在编译时具有已知的大小。由于缺少默认的ctors,它们必须在初始化时构建。类似于std::fill 但在初始化时可用。是的,我可以用指针将它推迟一段时间,直到 ctor 主体,但恕我直言。我该怎么做?
Bar 没有 constexper ctor,但也许这可能会有所帮助?
【问题讨论】:
-
在Config.cpp中实现
Foo的默认构造函数是否可行? coliru.stacked-crooked.com/a/bbbcba21c164cbdd -
@MooingDuck:这可以避免这个问题,但很好!通常最好一开始就避免这个问题。
-
@MooingDuck 是的,在我的特定用例中是可能的,但我认为这个问题应该代表那些没有能力修改他们可能必须使用的代码的人。
-
@brenzo:我的后续建议是将
#define CTOR_IMPL {Bar(ctor_arg), Bar(ctor_arg), Bar(ctor_arg)}放在标题中
标签: c++ initialization