c++ - 隐藏单个函数背后的 move 语义

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

例如我有一个可以处理 const T &T && 值的函数:

template <typename T>
/* ... */ foo(const T &) {
std::cout << "const T & as arg" << std::endl;
}

template <typename T>
/* ... */ foo(T &&) {
std::cout << "T && as arg" << std::endl;
}

有没有一种方法可以让我编写一个函数来自动处理这两种类型?如:

template <typename T>
/* ... */ bar(T t) {
    foo(t);
}

这样:

T a;
bar(a); // Handles as const T &
T b;
bar(std::move(b)); // Handles as T &&

谢谢!

最佳答案

您可以使用引用折叠和 std::forward 将参数转发foo 函数:

template <typename T>
/* ... */ bar(T&& t) {
    foo(std::forward<T>(t));
}

请注意您的foo 函数将接受右值、常量左值和非常量左值。例如,给定:

const int x = 456;
int y = 123;

然后:

foo(123);   // foo(T&&)
foo(x);     // foo(const T&)
foo(y);     // foo(T&&)

Live demo

关于c++ - 隐藏单个函数背后的 move 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24551546/

相关文章:

linux - 匹配模式的 mv 文件夹

rust - 我可以在类型转换期间重用结构体字段而不调用 .clone() 吗?

c++ toupper - 标准函数?

c++ - 文本不会在屏幕上输出 C++/OpenGL

qt - 在 qt creator(mingw 4.8 和 qt 5.3)中使用 c++11 功能时出现奇怪的错误

c++ - 错误 : reference to overloaded function could not be resolved; did you mean to call it?

c++ - 检查类型是否可以作为 boost::lexical_cast<string> 的参数

c++ - 具有不同签名的多态性和重载函数

c++ - 从图像点构建树/图

Ubuntu mv 命令只复制了,但源文件仍然存在