Pourquoi n'y a-t-il pas de std::make_unique
modèle de fonction dans la bibliothèque C ++ 11 standard? je trouve
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
un peu bavard. Les éléments suivants ne seraient-ils pas beaucoup plus agréables?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
Cela cache new
bien et ne mentionne le type qu'une seule fois.
Quoi qu'il en soit, voici ma tentative d'implémentation de make_unique
:
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
Il m'a fallu un certain temps pour obtenir les std::forward
éléments à compiler, mais je ne sais pas si c'est correct. C'est ça? Que std::forward<Args>(args)...
signifie exactement ? Qu'est-ce que le compilateur en fait?
make_unique
avec un suppresseur personnalisé, car il est évident qu'il alloue via plain old new
et doit donc utiliser plain old delete
:)
make_unique
serait limitée à l' new
allocation ... eh bien, c'est bien si vous voulez l'écrire, mais je peux voir pourquoi quelque chose comme ça ne fait pas partie de la norme.
make_unique
modèle car le constructeur de std::unique_ptr
est explicite, et donc il est verbeux de revenir unique_ptr
d'une fonction. Aussi, je préfère utiliser auto p = make_unique<foo>(bar, baz)
que std::unique_ptr<foo> p(new foo(bar, baz))
.
unique_ptr
prend un deuxième paramètre de modèle que vous devriez en quelque sorte autoriser - c'est différent deshared_ptr
.