gpt4 book ai didi

c++ - 在类主体中拆分构造函数代码

转载 作者:行者123 更新时间:2023-11-27 23:48:03 34 4
gpt4 key购买 nike

在 C++ 中是否有可能以某种方式将构造函数拆分为类主体中的多个部分?就像在 Scala 或 Kotlin 中一样?对于使用 C++ 元编程编写的 DSL,我需要它。

我有具有非平凡初始化序列的数据成员,我想在成员声明的同时指定初始化代码。

今天我有:

class foo {
foo() {
// code to initialize a;
a.something();
a.other_thing()
// code to initialize b;
b.other_thing(a);
}

T a;
T b;
};

相反,我想指定初始化代码和成员声明,​​例如:

class foo {
T a;
{
a.something();
a.other_thing()
}

T b;
{
b.other_thing(a);
}
};

我发现了两个我不喜欢的解决方案。首先是将 std::function 参数传递给每种类型,这样我就可以像这样初始化数据成员:

class foo {
a{ [&](){
// initialization code
}};
};

不幸的是,这需要重构我使用的所有第三方库。

第二个选项是引入一个“虚拟”数据成员来执行 lambda:

T a;
dummy_type a_init = [](&) { ... }

可以隐藏在 MACRO 中:

T a; INIT(a) { ... }

一切都很好,但我如何在 C++ 中创建一个零大小的对象,以便每个虚拟初始化程序都不会增加类大小?

最佳答案

如果立即调用 lambda,则无需任何外部更改即可使用它:

class foo
{
foo()
: a([=]() {
T a;
a.something();
a.other_thing();
return a;
}())
, b([=]() {
T b;
b.other_thing(a);
return b;
}())
{}

T a;
T b;
};

漂亮吗?一定不行!但它应该可以工作,除非 T 很难/不可能移动/复制。

( live demo )

您也可以内联移动初始化器:

class foo
{
T a = [=]() {
T a;
a.something();
a.other_thing();
return a;
}();

T b = [=]() {
T b;
b.other_thing(a);
return b;
}();
};

( live demo )

或者在某处设置一个工厂函数/类型,然后调用它。

如果你真的很绝望,让成员成为 unique_ptr 并像过去一样诉诸动态分配(你可以随心所欲地分散在你的构造函数主体中)。可能是最简单的解决方案。

class foo
{
public:
foo()
{
a = std::make_unique<T>();
a->something();
a->other_thing();

b = std::make_unique<T>();
b->other_thing(*a);
}

private:
std::unique_ptr<T> a;
std::unique_ptr<T> b;
};

( live demo )

关于c++ - 在类主体中拆分构造函数代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48975804/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com