2016-05-07 6 views
4

Ich habe eine Anforderung, wo Tupel wie folgt initialisiert werden muss. Wie erstelle ich ein Tupel, das das Objekt der Klasse A enthält?Wie initialisiert man ein Tupel mit einer gegebenen Klasse ohne Kopierkonstruktor

#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)))); 
} 

Ich kann die Klasse A in keiner Weise ändern.

+1

Was versuchen Sie _actually_ und was sind Ihre _actual_ Einschränkungen? Ich meine, wir können es wahrscheinlich in diesem Fall von Ihrem Code herleiten/erraten, aber Sie sollten _words_ verwenden, um es zu erklären, so dass diese Frage durchsuchbar und wiederverwendbar und klar ist. –

+0

'std :: forward' funktioniert nicht so, wie Sie denken, dass es funktioniert. In Ihrem Fall brauchen Sie nirgendwo 'std :: forward'. – bolov

+0

Sie versuchen auch, in 'createTuple' einen Lvalue-Verweis auf ein temporäres Objekt zurückzugeben. I – bolov

Antwort

1

Wie so:

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

A ‚s move Konstruktor wird nicht implizit deklariert, da Sie delete d der Kopierkonstruktor (die übrigens eine A const& nehmen sollte), so dass die Form Sie versuchen, wouldn zu verwenden ‚t gültig außerhalb von tuple sowieso:

A a = A(1); // error 

Wenn Sie einen Umzug Konstruktor benötigen, müssen Sie explizit schreiben ein:

A(A&& rhs) = default; 

an welchem ​​Punkt das funktionieren würde:

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

Beachten Sie, dass die forward überflüssig ist, da A(1) bereits ein R-Wert ist.


Ich kann die Klasse A in irgendeiner Art und Weise ändern.

Vorausgesetzt, dass Sie keine std::tuple<A> machen können. Das Mitglied int ist privat, so dass Sie nicht darauf zugreifen können, um den int Konstruktor zu verwenden, wie ich ursprünglich vorgeschlagen habe. Es gibt keinen Bewegungskonstruktor, daher können Sie diesen auch nicht verwenden. Das waren Ihre zwei Möglichkeiten - von denen keine offensichtlich machbar sind.

Darüber hinaus können Sie nicht einmal eine std::tuple<std::shared_ptr<A>> machen, da wieder A ist nicht kopierbar und Sie haben keine Möglichkeit, an der int Mitglied zu bekommen.

Spiel vorbei, Mann. Spiel ist aus.

+0

Danke, zwei Dinge kann ich nicht ändern, die Klasse A und kann kein Tuple-Objekt wie std :: tuple t (1) ;, wie das Objekt eines wird von einer anderen Funktion übergeben. Ich aktualisiere die Frage, bitte schau es dir an. – AAA

+0

@AAA Das sind Ihre zwei Möglichkeiten. Ich sehe keine Frage Update. – Barry

+0

Habe es gerade aktualisiert. – AAA