c++ - 使用 decltype 编写复制和 move 函数

标签 c++ templates c++11 move-semantics decltype

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

相关文章:

c++ - 为什么编译器在删除动态分配的内存后不自动将 NULL 分配给指针变量?

继承模板类中的 C++ 编译器错误

c++ - 多态局部变量的逼近

c++ - 在微小的 Xml 元素中更新数据

c++ - 当 clion 无法理解您的代码并重新格式化错误时,如何输入右大括号 `}`?

c++ - boost::spirit -- 试图编译最简单代码的编译器错误

c++ - 设置几个模板参数的值

Django 模板过滤执行顺序

c++ - 模板常量/非常量方法

c++ - 为什么初始化列表不能作为main的参数?怎么提议呢?