2016-05-07 4 views
4

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

Я не могу изменить класс А каким-либо образом.

+1

Что вы _actually_ пытаетесь сделать, и каковы ваши _actual_ ограничения? Я имею в виду, мы можем, вероятно, вывести/угадать его из вашего кода в этом случае, но вы должны использовать _words_, чтобы объяснить это, чтобы этот вопрос был доступен для поиска и повторного использования и ясен. –

+0

'std :: forward' не работает так, как вы думаете, он работает. В вашем случае вам не нужно 'std :: forward' где угодно. – bolov

+0

также в 'createTuple' вы пытаетесь вернуть ссылку lvalue на временный объект. I – bolov

ответ

1

Как так:

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

A «s движение конструктор не неявно объявляется, так как вы delete d конструктор копирования (который должен принять A const& BTW), так что форму вы пытаетесь использовать Wouldn «т быть действительным вне tuple равно:

A a = A(1); // error 

Если вам нужен конструктор двигаться, вам нужно явно написать один:

A(A&& rhs) = default; 

в какой момент это будет работать:

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

Обратите внимание, что forward является излишним, поскольку A(1) уже является Rvalue.


Я не могу изменить класс A каким-либо образом.

Учитывая, что вы не можете сделать std::tuple<A>. Элемент int является закрытым, поэтому вы не можете получить к нему доступ, чтобы использовать конструктор int, как я изначально предлагал. Нет конструктора перемещения, поэтому вы не можете использовать его. Это были ваши два варианта - ни одна из них, по-видимому, не жизнеспособна.

Кроме того, вы даже не можете сделать std::tuple<std::shared_ptr<A>>, так как снова A не подлежит копированию, и у вас нет способа добраться до члена int.

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

+0

Спасибо, две вещи, которые я не могу изменить в классе A и не могу создать объект кортежа, такой как std :: tuple t (1) ;, поскольку объект a передается из другой функции. Я обновляю вопрос, пожалуйста, проверьте его. – AAA

+0

@AAA Это ваши два варианта. Я не вижу никаких вопросов. – Barry

+0

Просто обновил его. – AAA