假设我有一个带有删除的copy和move构造函数的类。我想拥有一个工厂函数,该函数根据一些布尔x
在适当的位置构造对象,而无需分配动态内存(没有unique_ptr,new等)。
两个问题:
为什么以下内容引发use of deleted function 'Foo::Foo(const Foo&&)'
?搬到哪里去了?
我如何才能实现我想要做的事情?
谢谢。下面的代码:
已编辑:
我想做的是创建一个单一的工厂函数,该函数可以根据某些变量X创建父对象或子对象。在删除/复制后,此构造必须就位。
class Foo
{
public:
Foo(int _x) : x(_x) {}
Foo(const Foo&) = delete;
Foo(const Foo&&) = delete;
int x = 10;;
};
class Bar : public Foo
{
public:
Bar(int _y) : Foo(10), y(_y) {}
int y;
};
Foo make_dynamic(int a, bool x) {
if (x) {
return Foo{a};
} else {
return Bar{a};
}
}
Foo make_just_foo(int a)
{
return Foo{a};
}
Foo make_just_bar(int a)
{
return Bar{a};
}
int main() {
Foo&& dynamic = make_dynamic(10, true); // works when copy/move not deleted
Foo&& f = make_just_foo(10);
Foo &&b2 = make_just_bar(10); // works when copy/move not deleted
}
答案 0 :(得分:0)
我做这项工作的唯一方法是使用union
,(因为我不能使用std::variant
或std::any
来工作,因为它们都需要Foo和Bar至少可以移动)
您需要一个Dynamic结构体来作为返回类型:
// acts as home made std::variant
struct Dynamic {
union {
Foo foo;
Bar bar;
};
int active;
};
并使用指定的初始化程序C ++ 20构造它,但已经存在并且可以在当前的GCC和Clang中使用:
Dynamic make_dynamic(int a, bool x) {
if (x) {
return {{.foo = Foo{2}}, 0};
} else {
return {{.bar = Bar{2}}, 1};
}
}
最后我们可以获得动态Foo:
Dynamic dynamic = make_dynamic(10, true);
Foo* foo = dynamic.get();
您还可以添加getFoo()和getBar()方法以返回对Dynamic
结构的引用。