2

我的代码有几个实例,其中函数在遇到 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 */
}

是否可以按照这个伪代码的行写一些东西:

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 */
}

还是有更好的方法来编写几乎相同的移动和复制功能?

4

1 回答 1

5

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()newt完全按照传递给push_back(). 导致:

  • T如果push_back()传递了一个左值,则使用的复制构造函数,或
  • T如果push_back()传递了一个右值,则使用的移动构造函数。

请参阅http://ideone.com/HjOrap上的在线演示。

请注意,如果push_back()是独立函数或非模板类的成员函数,则这是正确的。如果它是模板类成员函数,则函数本身必须接受除了类模板类型之外的模板类型,因为此行为取决于T推导类型。

请参阅Scott Meyers 的Universal References

于 2013-02-13T21:43:48.837 回答