例如我有一个可以处理 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&&)
关于c++ - 隐藏单个函数背后的 move 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24551546/