构造函数使用可变数量的右值引用
Constructor consuming a variable number of rvalue references
我希望创建一个对象 A,它可以通过复制或移动可变数量的对象 B 来构造。像这样:
class B {}
class A {
A(B&& operand1, B&& operand2, ... B&& operandk) {
// move construct A
}
A(B& operand1, B& operand2, ... B& operandk) {
// copy construct B
}
}
我似乎无法找到一种方法来在任何类型的可迭代容器中存储 r 值引用来完成此操作。我读过 std::reference_wrapper
但它似乎不允许 r 值。有没有办法完成这样的事情,或者我根本不应该尝试这样做的原因是什么?非常感谢。
当您需要拥有一个对象时,只需按值获取即可。调用者可以移动构造或复制构造参数,具体取决于他们是否需要保留要提供给构造函数的对象的副本。
而且 - 甚至更好 - 这样他们可以移动构造 一些 对象而不是其他对象。
在构造函数中,您可以使用初始化列表中的 B
对象自由移动构造您的 A
子对象,因为您知道调用者已经复制了任何需要复制的内容。
要接受可变数量的参数,只需让您的构造函数成为一个接受参数包的模板,并且参数按值:
class A {
public:
template <typename... T>
A(T ...);
};
在实现中,你可以在从每个参数移动构造一个 B
之后做任何你需要做的事情。如果参数不能全部用于创建 B
:
,这将导致构造函数模板无法实例化
template <typename... T>
A::A(T ... args) {
(... , do_something_with_a_B(B{std::move(args)}));
}
我希望创建一个对象 A,它可以通过复制或移动可变数量的对象 B 来构造。像这样:
class B {}
class A {
A(B&& operand1, B&& operand2, ... B&& operandk) {
// move construct A
}
A(B& operand1, B& operand2, ... B& operandk) {
// copy construct B
}
}
我似乎无法找到一种方法来在任何类型的可迭代容器中存储 r 值引用来完成此操作。我读过 std::reference_wrapper
但它似乎不允许 r 值。有没有办法完成这样的事情,或者我根本不应该尝试这样做的原因是什么?非常感谢。
当您需要拥有一个对象时,只需按值获取即可。调用者可以移动构造或复制构造参数,具体取决于他们是否需要保留要提供给构造函数的对象的副本。
而且 - 甚至更好 - 这样他们可以移动构造 一些 对象而不是其他对象。
在构造函数中,您可以使用初始化列表中的 B
对象自由移动构造您的 A
子对象,因为您知道调用者已经复制了任何需要复制的内容。
要接受可变数量的参数,只需让您的构造函数成为一个接受参数包的模板,并且参数按值:
class A {
public:
template <typename... T>
A(T ...);
};
在实现中,你可以在从每个参数移动构造一个 B
之后做任何你需要做的事情。如果参数不能全部用于创建 B
:
template <typename... T>
A::A(T ... args) {
(... , do_something_with_a_B(B{std::move(args)}));
}