使用new与decltype

nwp*_*nwp 16 c++ decltype c++11

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
Run Code Online (Sandbox Code Playgroud)

这回答了为什么decltype(*t)返回T &而不是T.

我可以把我的最后一行放到一个宏中,但这似乎不是最理想的.有没有比我到目前为止更好的解决方案?这是否属于Code Review?

Rei*_*ica 11

如果它们在同一行,您只能使用一次auto命名T:

auto t = new T;
Run Code Online (Sandbox Code Playgroud)

否则,您可以创建一个小函数模板:

template <class T>
void do_new(T * &p) {
  p = new T;
}


// Usage:
int main()
{
  T *t;
  do_new(t);
}
Run Code Online (Sandbox Code Playgroud)

正如@MadScienceDreams指出的那样,您可以扩展它以允许非默认构造函数:

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");
}
Run Code Online (Sandbox Code Playgroud)

  • 俏皮.我会继续将make"do_new"作为一个可变参数模板,这样新的可以有参数. (3认同)

Rob*_*ahy 5

std::remove_pointer<decltype(t)>::type 更具表现力/清晰。

typedef如果重复几次,也可能会使用局部变量,否则会使某行变得过长或过于复杂。