Sue*_*ode 2 c++ templates decltype move-semantics c++11
我的代码有几个实例,当遇到T &&或const T&时函数的反应略有不同,但是函数本身很长(注意T只是一些对象类型).例如:
void push_back(const T& newt){
/* code block X */
new (ptr) T(newt);
/* code block Y */
}
void push_back(T&& newt){
/* code block X */
new (ptr) T(std::move(newt));
/* code block Y */
}
Run Code Online (Sandbox Code Playgroud)
是否可以按照这个伪代码的方式写一些东西:
template<typename S>
void push_back(S newt){
/* code block X */
#if decltype(newt)==T&&
new (ptr) T(std::move(newt));
#else
new (ptr) T(newt);
#endif
/* code block Y */
}
Run Code Online (Sandbox Code Playgroud)
或者是否有更好的方法来编写几乎相同的移动和复制功能?
std::forward()在T&&功能中使用并丢弃const T&功能:
template <typename T>
void push_back(T&& newt){
/* code block X */
new (ptr) typename std::remove_reference<T>::type(std::forward<T>(newt));
/* code block Y */
}
Run Code Online (Sandbox Code Playgroud)
std::forward()将传递newt完全传递给push_back().导致:
T正在使用的复制构造函数,如果push_back()传递左值,或者T如果push_back()传递一个右值,则使用的移动构造函数.请参阅http://ideone.com/HjOrap上的在线演示.
请注意,如果push_back()是独立功能或非模板类的成员功能,则这是正确的.如果它是模板类成员函数,那么除了类模板类型之外,函数本身必须接受模板类型,因为此行为取决于T是推导类型.
参见Scott Meyers的Universal References.
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |