転送:一部の関数では、1つ以上の実パラメータをタイプとともに他の関数に転送する必要があります.


16.47自分のバージョンの反転関数を作成し、左値と右値の参照パラメータを受け入れる関数を呼び出してテストします.
#include<iostream>

#include<string>

#include<utility>

using namespace std;



template <typename T>

int compare(const T &a ,const T &b)

{

    if(a<b) return -1;

    if(b<a) return 1;

    return 0;

}



template <typename T>

auto sum(T a,T b)->decltype(a+b)

{

    return a+b;

}

// 

template<typename F,typename T1,typename T2>

void flip(F f,T1 &&t1,T2 &&t2)

{

    f(std::forward<T2>(t2),std::forward<T1>(t1));

}



void f(int v1,int &v2)

{

    cout<<v1<<" "<<++v2<<endl;

}

void g(int &&i,int &j)

{

    cout<<i<<" "<<j<<endl;

}

int main()

{

    int j=8;

    compare<const char*>("hi","world");

    flip(f,j,42);

    cout<<j<<endl;

    flip(g,j,42);

}