【发布时间】:2021-01-25 03:13:11
【问题描述】:
我有一个有多个构造函数的类:
class Obj
{
public:
Obj(int x, int y) {}
Obj(std::string const& str) {}
Obj(char v, int s) {}
};
现在我想向存储在对象中的构造函数添加一个 Options 对象。但为了使这项工作顺利进行,我想尽可能移动选项,但在必须时复制。看来我必须将构造函数的数量增加一倍才能支持选项的移动和复制。
class Options {};
class Obj
{
Options options;
public:
Obj(Options const& o, int x, int y): options(o) {}
Obj(Options const& o, std::string const& str):options(o) {}
Obj(Options const& o, char v, int s) :options(o) {}
Obj(Options&& o, int x, int y): options(std::move(o)) {}
Obj(Options&& o, std::string const& str):options(std::move(o)) {}
Obj(Options&& o, char v, int s) :options(std::move(o)) {}
};
如果我使用了模板,我可以使用完美转发并获得正确的效果。
template<typename Options>
class Obj
{
Options options;
public:
Obj(Options&& o, int x, int y): options(std::forward<Options>(o)) {}
Obj(Options&& o, std::string const& str):options(std::forward<Options>(o)) {}
Obj(Options&& o, char v, int s) :options(std::forward<Options>(o)) {}
};
问题在于我知道Options的类型。
【问题讨论】:
-
您真的需要完美转发吗?仅按值复制它应该足够快(假设移动的成本可以忽略不计)。
标签: c++ constructor forwarding