Utilisation de range-for sur un vector<unique_ptr>
Bonjour à tous
Je me posais la question de savoir s'il était possible d'utiliser les range-based loop for sur un vecteur d'unique_ptr :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void foo(A const& a) const {}
typedef std::vector< std::unique_ptr<A> > V
typedef V::const_iterator iterator;
V v;
// for(auto a : v) // error : le constructeur par copie n'est pas valide
// foo(a);
for (auto it = v.begin(); it != v.end(); ++it)
transform(*it->get()); // ok avec un for normal
std::for_each(v.begin(), v.end(), [](iterator it){ foo(*it->get()); } ); // ok avec les lambdas |
Remarque :
- v a la responsabilité de la destruction des éléments du vecteurs : unique_ptr
- foo() utilise simplement les éléments du vecteur : référence constante
Si quelqu'un a une idée. Merci
PS : il est possible d'utiliser "auto" dans la fonction lambda à la place de "iterator" ici ?
PS2 : au cas où, gcc 4.6.1 sous Linux 64
PS3 : encore sur l'utilisation de unique_ptr
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| // Version 1
auto a = new A;
// traitements sur a
v.push_back(std::unique_ptr<A>(a));
m.insert(std::make_pair(k, a)); // m est de type map<K,A*>
// Version 2
auto a = std::unique_ptr<A>(new A);
// traitements sur
m.insert(std::make_pair(k, a.get())); // ok
v.push_back(std::move(a));
m.insert(std::make_pair(k, a.get())); // fail... |
Quel est le plus sûr en terme de fuite mémoire ? en terme d'écriture ? dans le cas où les traitements ne peuvent pas lancer d'exception ? dans le cas où les traitements peuvent lancer des exception ?
De plus, a priori, il n'y a pas de fonction make_unique qui serait équivalent à make_shared. Un oubli ? Un choix volontaire ? J'ai besoin de voir un opticien ?
Merci