gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:40:22 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com