Utiliser new avec decltype

T *t; //T is an implementation detail t = new T; //want to avoid naming T to allow for flexibility t = new decltype(*t); //error: cannot use 'new' to allocate a reference t = new std::remove_reference::type(); //clunky 

Ceci répond à la raison decltype(*t) laquelle decltype(*t) retourne T & et pas T

Je peux mettre ma dernière ligne dans une macro, mais cela semble sous-optimal. Y a-t-il une meilleure solution que celle que j’ai jusqu’à présent? Cela appartient-il à la révision du code ?

S’ils sont sur la même ligne, vous pouvez utiliser auto pour ne nommer que T une seule fois:

 auto t = new T; 

Sinon, vous pourriez créer un petit modèle de fonction:

 template  void do_new(T * &p) { p = new T; } // Usage: int main() { T *t; do_new(t); } 

Comme @MadScienceDreams l’a souligné, vous pouvez étendre cela pour autoriser les constructeurs autres que ceux par défaut:

 template  void do_new(T * &p, Arg &&... arg) { p = new T(std::forward(arg)...); } // Usage: int main() { T *t; do_new(t); std::ssortingng *s; do_new(s, "Abc"); } 

std::remove_pointer::type est plus expressif / clear.

Vous pouvez également utiliser un typedef local si cela est répété plusieurs fois ou si une certaine ligne devient trop longue / compliquée.