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):保持原來石材的類型轉發入模板內函數
完美轉發:讓我們可以寫接受任意類型實參的函數模板,並將其轉發到目標函數,目標函數會接收到與轉發函數所接收到的完全相同的參數類型;