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):保持原来石材的类型转发入模板内函数

完美转发:让我们可以写接受任意类型实参的函数模板,并将其转发到目标函数,目标函数会接收到与转发函数所接收到的完全相同的参数类型;

 

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