Un contenitore di unique_ptr
sembra avere poco senso: non è possibile utilizzarlo con gli elenchi di inizializzatore e non è riuscito a scorrere il contenitore (soluzioni alternative in basso). Sto fraintendendo qualcosa? O quando ha senso usare i contenitori unique_ptr
e STL?Quando ha senso usare unique_ptr con i container STL? (C++ 11)
#include <memory>
#include <vector>
using namespace std;
struct Base { void go() { } virtual ~Base() { } };
// virtual ~Base() = default; gives
// "declared virtual cannot be defaulted in the class body" why?
class Derived : public Base { };
int main() {
//vector<unique_ptr<Base>> v1 = { new Derived, new Derived, new Derived };
//vector<shared_ptr<Base>> v2 = { new Derived, new Derived, new Derived };
vector<Base*> v3 = { new Derived, new Derived, new Derived };
vector<shared_ptr<Base>> v4(v3.begin(), v3.end());
vector<unique_ptr<Base>> v5(v3.begin(), v3.end());
for (auto i : v5) { // works with v4
i->go();
}
return 0;
}
Le seguenti domande aiutato a trovare queste soluzioni alternative:
How to initialize a container of noncopyable with initializer list?
when I need containers of NoCopy types I usually use
boost::ptr_vector
orstd::vector<shared_ptr>
'vector> v1 = {make_unique (), make_unique (), make_unique ()};' <- Avete provato questo? –
Come allude @Benjamin, gli elenchi di inizializzatori eseguono copie per definizione, quindi non possono essere utilizzati con oggetti di sola spostamento. – ildjarn
@ Benjamin: Certo, no, dato che al momento non ho a disposizione alcun compilatore che supporti elenchi di inizializzatori del genere.Tuttavia, non vedo quale problema potrebbe sorgere? – Xeo