2016-10-21 3 views
2

Ich habe zwei Arten von std :: unique_ptr, die innerhalb einer boost :: Variante gehalten werden. Ich versuche, eine Unterklasse von boost :: static_visitor zu schreiben, um eine const-Referenz auf das zugrundeliegende Objekt zu extrahieren, auf das die beiden unique_ptr-Varianten, auf die meine boost :: variant basiert, gestempelt werden. Das Setup sieht wie folgt aus:Boost :: Besucher mit einem boost :: Variante von unique_ptr

using bitmap_flyweight_t = boost::flyweights::flyweight<allegro_bitmap_t>; 
using image_bitmap_flyweight_t = boost::flyweights::flyweight<boost::flyweights::key_value<const char*, allegro_bitmap_t>>; 

class bitmap_visitor : public boost::static_visitor<allegro_bitmap_t> 
{ 
public: 
    const allegro_bitmap_t& operator()(const std::unique_ptr<bitmap_flyweight_t> bitmap_ptr) const 
    { 
     return bitmap_ptr.get()->get(); 
    } 

    const allegro_bitmap_t& operator()(const std::unique_ptr<image_bitmap_flyweight_t> bitmap_ptr) const 
    { 
     return bitmap_ptr.get()->get(); 
    } 
}; 

Ich bin in der Lage, die unique_ptrs in ein Objekt der boost :: variant Membervariable auf Instanziierung bewegen Semantik zu setzen, gibt es keine Compiler Beschwerden. Wenn ich jedoch versuche, mit dem obigen Besucher auf den Variant-Typ zuzugreifen, beklagt sich der Compiler, dass dies nicht möglich ist, da unique_ptr nicht kopierbar ist.

+3

Haben Sie versucht, eine Referenz zu akzeptieren? – krzaq

Antwort

2

Akzeptieren Sie eine Konstante const auf den eindeutigen Zeiger.

class bitmap_visitor : public boost::static_visitor<allegro_bitmap_t> 
{ 
public: 
    const allegro_bitmap_t& operator()(const std::unique_ptr<bitmap_flyweight_t>& bitmap_ptr) const 
    { 
     return bitmap_ptr.get()->get(); 
    } 

    const allegro_bitmap_t& operator()(const std::unique_ptr<image_bitmap_flyweight_t>& bitmap_ptr) const 
    { 
     return bitmap_ptr.get()->get(); 
    } 
}; 

Hier ist ein live demo eines Spielzeugprojekts.

+0

Ah, sicher. Ich bin etwas neu in meinen Projekten mit intelligenten Zeigern, also denke ich, dass die Vorstellung, einen "Verweis auf einen Zeiger" zu übergeben, mich stolperte ... – Bitrex

+1

@Bitrex denke nur an sie als reguläre Objekte. Sie können ein nicht kopierbares Objekt nicht kopieren und das war's;) – krzaq

Verwandte Themen