1,テンプレート関数でtype f<double,int>(double a,int b) という関数を作り戻り値の型をtype型にしたいのですがどうすればいいのでしょうか?

2,また、テンプレートの特殊化で引数の型が違う型を二つ取ろうとうするとエラーになりますその場合はどのようにすれば解決できるのでしょうか?
3,テンプレート関数の明示的特殊化と、テンプレート関数の使い分けを教えてほしいです。

        template<typename type,typename typeb> type f(type a,typeb b) {

            cout << "テンプレート関数\n";
            return  3.14;

        }
        //ここです、↓指定された引数と一致するテンプレート関数fのインスタンスがりません
       template<> int f<double, int>(double a,int b){ return 4;}

        int main() {

            double x = 3.14 + 2;

            //cout << func(3.14);

            //cout << x;

            cout << f<double,int>(3.14,123);





            _getch();
            return 0;
        }