gpt4 book ai didi

c++ - 在两个构造函数之间进行选择

转载 作者:太空宇宙 更新时间:2023-11-04 14:50:04 24 4
gpt4 key购买 nike

问题:我有一个带有两个构造函数的不可复制对象。我需要使用其中一个构造函数创建一个对象,然后在一些通用代码中使用它:-

对于可复制的对象,它看起来像这样,而且很简单:

Object a;

if (condition)
a = Object(p1);
else
a = Object(p2,p3,p4);

a.doSomething();

但是,该对象是不可复制的,所以我不得不这样做:

boost::scoped_ptr<Object> a;

if (condition)
a = new Object(p1);
else
a = new Object(p2,p3,p4);

a->doSomething();

这感觉太复杂了。有更好的解决方案吗?

最佳答案

这是一个非常糟糕的 hack,假设 Object 是默认可构造的:

Object a;
a.~Object();

if (condition) { ::new (&a) Object(p1); }
else { ::new (&a) Object(p2, p3, p4); }

Don't use this.

另一种选择是使用 union ,但您还需要在该设置中手动调用析构函数。


可以使用 Boost.Optional 实现更清洁的解决方案(使用 in-place factories )。 (感谢@K-Ballo 挖掘细节!)

#include <boost/optional.hpp>
#include <boost/utility/in_place_factory.hpp>

struct Object
{
explicit Object(int) {}
explicit Object(int, float, std::string) {}

Object(Object const &) = delete;
Object(Object &&) = delete;
Object & operator=(Object const &) = delete;
Object & operator=(Object &&) = delete;
};

boost::optional<Object> a;

if (condition) { a = boost::in_place(0); }
else { a = boost::in_place(0, 1.0f, "two" ); }

关于c++ - 在两个构造函数之间进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14404904/

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