template <typename F, typename T1, typename T2>
void myFuncTemp(F f, T1 t1, T2 t2){
f(t1, t2);
}
void myfunc(int v1, int &v2){
++v2;
cout << v1 + v2 << endl;
}
int main(){
int j = 10;
myFuncTemp(myfunc, 12, j); //执行到此 j应该 +1 j=11,但是此处j=10
}
此处相当于:myFuncTemp(f=myfunc, t1=12, t2=j)
myfunc(v1=t1, &v2=t2)
万能引用出场:T&&,实参的所有信息都会传递到万能引用当中去,从而让编译器推导出来函数模板最终的形参类型。
template <typename F, typename T1, typename T2>
void myFuncTemp(F f, T1 &&t1, T2 &&t2){
f(t1, t2);
}
void myfunc(int v1, int &v2){
++v2;
cout << v1 + v2 << endl;
}
int main(){
int j = 10;
myFuncTemp(myfunc, 12, j);
}
template <typename F, typename T1, typename T2>
void myFuncTemp(F f, T1 &&t1, T2 &&t2){
f(std::forward<T1>(t1), std::forward<T2>(t2));
}
void myfunc(int &&v1, int &v2){ //当v1为右值引用时,调用转发会报错,此时应使用std::forward
++v2;
cout << v1 + v2 << endl;
}
int main(){
int j = 10;
myFuncTemp(myfunc, 12, j); //此时各种情况均适用
}
std::forward<T> (t):保持原来石材的类型转发入模板内函数
完美转发:让我们可以写接受任意类型实参的函数模板,并将其转发到目标函数,目标函数会接收到与转发函数所接收到的完全相同的参数类型;