C++日記——Day60:轉發、完美轉發

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):保持原來石材的類型轉發入模板內函數

完美轉發:讓我們可以寫接受任意類型實參的函數模板,並將其轉發到目標函數,目標函數會接收到與轉發函數所接收到的完全相同的參數類型;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章