我有一个要求,需要按如下方式初始化元组。如何创建包含A类对象的元组?
#include <iostream>
#include <tuple>
using namespace std;
class A{
int a;
public:
A(const A&)=delete;
A(int a): a(a){}
};
std::tuple<A>& createTuple(A &&a){
return std::make_tuple<A>(std::forward<A>(a));
}
int main(){
std::cout << std::get<0>(createTuple(std::forward<A>(A(1))));
}
我无法以任何方式修改A类。
答案 0 :(得分:1)
像这样:
std::tuple<A> t(1);
A
的移动构造函数未被隐式声明,因为您delete
复制构造函数(应该使用A const&
btw),因此您尝试使用的表单无论如何都不会在tuple
之外有效:
A a = A(1); // error
如果你需要一个移动构造函数,你需要显式地写一个:
A(A&& rhs) = default;
这将起作用:
std::tuple<A> t(A(1));
请注意forward
是多余的,因为A(1)
已经是右值。
我无法以任何方式修改班级
A
。
鉴于此,你不能成为std::tuple<A>
。成员int
是私有的,因此您无法像我最初提出的那样访问它以使用int
构造函数。没有移动构造函数,因此您也不能使用它。这是你的两个选择 - 两者都不显然是可行的。
此外,您甚至无法制作std::tuple<std::shared_ptr<A>>
,因为A
再次int
是不可复制的,您无法访问sh "/Library/Application Support/Jenkins/Uninstall.command"
成员。
游戏结束,伙计。游戏结束。