c++ - Usando nuevo con decltype
c++11 (2)
Si están en la misma línea, puedes usar auto
para nombrar solo T
una vez:
auto t = new T;
De lo contrario, podría crear una plantilla de función pequeña:
template <class T>
void do_new(T * &p) {
p = new T;
}
// Usage:
int main()
{
T *t;
do_new(t);
}
Como señaló @MadScienceDreams, puede extender esto para permitir constructores no predeterminados:
template <class T, class... Arg>
void do_new(T * &p, Arg &&... arg) {
p = new T(std::forward<Arg>(arg)...);
}
// Usage:
int main()
{
T *t;
do_new(t);
std::string *s;
do_new(s, "Abc");
}
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<decltype(*t)>::type(); //clunky
This responde por qué decltype(*t)
devuelve T &
y no T
Puedo poner mi última línea en una macro, pero eso parece subóptimo. ¿Hay una solución mejor que la que tengo hasta ahora? ¿Pertenece esto en Code Review ?
std::remove_pointer<decltype(t)>::type
es más expresivo / claro.
También puede usar un typedef
local si esto se repite varias veces, o haría que una determinada línea crezca excesivamente larga / complicada.