Как инициализировать кортеж с заданным классом без конструктора копирования

У меня есть требование, где кортеж должен быть инициализирован следующим образом. Как мне создать кортеж, содержащий объект класса 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 в любом случае.

4

Решение

Вот так:

std::tuple<A> t(1);

AКонструктор ходов не объявляется неявно, так как вы deleted конструктор копирования (который должен занять 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 член.

Игра окончена, чувак. Игра окончена.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]