У меня есть требование, где кортеж должен быть инициализирован следующим образом. Как мне создать кортеж, содержащий объект класса 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 в любом случае.
Вот так:
std::tuple<A> t(1);
A
Конструктор ходов не объявляется неявно, так как вы delete
d конструктор копирования (который должен занять A const&
кстати), поэтому форма, которую вы пытаетесь использовать, не будет действительной вне 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
член.
Игра окончена, чувак. Игра окончена.
Других решений пока нет …