48463


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

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

[code]

            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;
            }
    
[/code]


CC BY-SA 4.0
2018-09-16T13:19:45.197
48461
2018-09-16T14:33:44.317
question
c++
c++,テンプレート関数の使い方について


元のテンプレートの定義は

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

で、戻り値の型`type`と最初の引数の型`type`が同じです。一方、特殊化した方は

`template<> int f<double, int>(double a,int b)`

となっており、戻り値の型`int`と最初の引数の型`double`が異なっています。このため、元のテンプレートと一致せずエラーになっています。両方の型が一致するように修正すればコンパイルが通るようになります。

* * *

テンプレートの特殊化は、ある特定のテンプレート引数の時ときだけコードを変えたいとき(例えば、特定の型だけに効率の良いアルゴリズムがあるとき)に使います。

例えば、値を２倍する関数を作るとき、普通は足し算で計算するが、`int`の値のときだけはビットシフトを使うということができます
(別にビットシフトにすれば計算が速くなるというわけでもないので、ご注意を)。

[code]

    #include <iostream>
    
    template<typename T> T times2(T v) {
        std::cout << "generic\n";
        return v + v;
    }
    
    template<> int times2<int>(int v)
    {
        std::cout << "int\n";
        return v << 1;
    }
    
    int main() {
        std::cout
            << times2(3.25) << '\n' // 引数が double なので、元のテンプレート
            << times2(3) << '\n'    // 引数が int なので、特殊化テンプレート
            << times2(5L) << '\n';  // 引数が long なので、元のテンプレート
    
        return 0;
    }
    
[/code]

まあ、特殊化したテンプレートで、まったく異なることをすることもできるわけですが、テンプレート関数の利用者からすると混乱の元なので、一般的に悪い設計で避けるべきでしょう。


CC BY-SA 4.0
2018-09-16T14:33:44.317
48463
2018-09-16T14:33:44.317
3605
48461
answer