我正在学习模板,尝试实现以下方法:
template <typename Func, typename Left, typename Right>
void flipArgs(Func* function, Left&& leftArg, Right&& rightArg) {
function(std::forward<Right>(rightArg), std::forward<Left>(leftArg));
}
它需要一个函数和两个参数,并使用反转后的两个参数调用给定的函数。
它适用于像以下这样的函数:
void test1(std::string, int) {
}
当我尝试使用这个函数时:
template <typename T>
void test2(T&& a, int) {
}
使用:
string s("test");
flip(test2<string>, 42, s);
编译器(g++ 4.7.1)告诉我:
错误:不能将 'std::basic_string' 左值绑定到 'std::basic_string&&'
我以为像 T&&
这样的函数参数是一种特殊情况,可以绑定到 rvalue
和 lvalue
引用?我做错了什么吗?
flip(test2, 42, s)
,但注意到当传递test2
函数指针时无法知道特化的部分,因此尝试传递test2<string>
。我错过的部分是现在我的函数不再是一个模板,这意味着T&&
不再存在。谢谢! - Timo Türschmann