gpt4 book ai didi

c++ - 根据标志为成员初始化列表中的成员触发特定构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:04 26 4
gpt4 key购买 nike

我想根据传递给包含类的构造函数的标志为成员变量触发特定的构造函数。

如果我从一个简单的例子开始是最简单的:

#include <boost/optional.hpp>
#include <boost/none.hpp>
#include <boost/utility/typed_in_place_factory.hpp>

struct state
{
bool flag1;
bool flag2;
int value;
};

class A
{
public:
A() : _a() {}
A(boost::none_t none) : _a() {}
A(state& st) : _a(st.value) {}
A(const A& copy) : _a(copy._a) {}

private:
boost::optional<int> _a;
};

class B
{
public:
B() : _b() {}
B(boost::none_t none) : _b() {}
B(state& st) : _b(st.value) {}
B(const B& copy) : _b(copy._b) {}

private:
boost::optional<int> _b;
};

class C
{
public:
C() : _a(boost::none_t()), _b(boost::none_t()) {}
C(state& st) :
_a(st.flag1 ? st : boost::none_t()),
_b(st.flag2 ? st : boost::none_t())
{}

private:
boost::optional<A> _a;
boost::optional<B> _b;
};

int main(void)
{
state f = { true, false, 10 };
C c(f);

return 0;
}

所以想法是触发 A 的构造函数与 state ,但是 Bboost::none_t .
上面的代码无法编译,因为三元运算符期望两种可能性的类型相同,并且 stateboost::none_t不是同一类型。谁能想出一个优雅的方法来解决这个问题?

我知道两种解决方案:

  1. 复制结构,即

    _a(st.flag1 ? A(st) : A(boost::none_t())),
    _b(st.flag2 ? B(st) : B(boost::none_t()))

  2. 使用指针代替 boost::optional<> , 然后

    _a(st.flag1 ? new A(st) : new A(boost::none_t())),
    _b(st.flag2 ? new B(st) : new B(boost::none_t()))

#2 不太吸引人,因为我试图避免动态内存分配(真实示例有数十个成员和包含更多成员的深层嵌套结构)。
#1 也没有吸引力,因为我需要构建然后复制。

有更好的选择吗?

编辑:state由构造中的成员修改,所以我不想用 state 构造一些东西如果未设置标志。

最佳答案

您必须学会相信编译器的优化器能够充分内联此类内容,否则您将限制自己使用 99% 的标准库和高级 C++ 工具。

首先查看 boost 可选 API:

...
optional(bool condition, T const&);
...

建议添加匹配的构造函数...

A(bool condition, T const& v) : _a(condition, v) { }

...并在您的初始化中使用它...

_a(st.flag1, st.value)

关于c++ - 根据标志为成员初始化列表中的成员触发特定构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4095218/

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