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
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.