我的代码有几个实例,其中函数在遇到 T&& 或 const T& 时 react 仅略有不同,但是函数本身很长(请注意 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 */
}
是否有可能按照这个伪代码的思路写一些东西:
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 */
}
或者是否有更好的方法来编写几乎相同的 move 和复制函数?
最佳答案
使用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 */
}
std::forward()
将完全按照传递给 push_back()
的方式传递 newt
。结果:
- 如果
push_back()
传递了一个左值,则使用T
的复制构造函数,或者 - 如果
push_back()
被传递了一个右值,则使用T
的 move 构造函数。
查看在线演示 http://ideone.com/HjOrap .
请注意,如果 push_back()
是独立函数或非模板类的成员函数,则这是正确的。如果它是模板类成员函数,那么除了类模板类型之外,函数本身还必须接受模板类型,因为此行为取决于 T
是推导类型。
参见 Universal References斯科特迈耶斯。
关于c++ - 使用 decltype 编写复制和 move 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14863636/