2014-10-13 21 views
8

Sadece std::map'un içinde ayrılmak üzere kısıtlamak istediğim bir nesnem var. AmacıylaStd :: map'e aktarılamaz ve taşınamaz bir nesne nasıl ayrılır?

#include <map> 

class Value 
{ 
public: 
    Value(int value) { _value = value;} 
    Value(const Value&) = delete; 
    Value& operator=(const Value&) = delete; 
    Value(Value&&) = default;  // *** 
    void* operator new(size_t) = delete; // not on free store 
private: 
    int _value; 
}; 

class Container 
{  
public: 
    Container(); 
    Value* addToMap(int key) { 
     auto ret = _map.emplace(key, key); 
     return &(ret.first->second); 
    } 
private: 
    std::map<int, Value> _map; 
}; 

ben varsayılan hareket yapıcı talep eden yıldız işaretleriyle işaretlenmiş bir çizgi eklemek zorunda clang kullanarak Mac'te derlemek yapmak: İşte basitleştirilmiş bir koddur. Ancak bu satır, Windows Visual Studio'da derlendiğinde C2610 hatasına neden olur. VS2013 C++ 11 uyumsuzluğu, varsayılan taşıma yapıcılarını üretememeyi de içerir. Standart harita içinde bir nesneyi platformlar arasında derleyeceğim veya kendi hareket ettiren kurucuyu uygulamak zorunda mıyım?

+0

Neden bu kısıtlamayı eklemek istersiniz? –

+0

Nesnenin yalnızca kapsayıcı tarafından sahiplenilmesini ve diğer kodların yeni ve silinmesini engellemesini istiyorum. – LRaiz

+0

Nesneleri ve veri yapılarını karıştırıyorsunuz. Veri yapınızın kullanıcısı nesneyi kopyalamak istiyorsa, neden olmasın? –

cevap

8

bir seçenek std::piecewise_construct kullanmaktır:

Value* addToMap(int key) { 
    auto ret = _map.emplace(std::piecewise_construct 
          , std::forward_as_tuple(key) 
          , std::forward_as_tuple(key)); 
    return &(ret.first->second); 
} 

VC++ DEMO

+0

Güzel görünüyor. Teşekkür ederim. – LRaiz