3

テンプレート パラメーターに依存しない静的関数を含むテンプレート クラスがあります。それでも、コンパイラは、関数を使用するときに型名を指定するように強制しているようです。

template <typename T>
class MyClass {
    ...
    static void function();
};

template <typename T>
void MyClass<T>::function() {
    ....
}

この関数は次のように使用できます。

MyClass<int>::function();

しかし、「int」はコンパイラを満足させるためにあるだけです。それは何の意味もなく、コードの可読性を向上させない他の型に置き換えることができます。私は次のようなことをしたいと思います

MyClass<>::function();

あるいは

MyClass::function();

しかし、コンパイラは私を許しません。これは、ヘッダー ファイルで関数がテンプレート化されていることを明示的にマークしているためであることに気付きましたが、ヘッダー ファイルから '< T >' を削除してもコンパイルされません。

これを行う正しい方法は何ですか?

4

3 に答える 3

7

種類が大事!

テンプレートは特殊化できるため、次のようになります。

template <typename T>
class MyClass {
public:
    static void function() { std::cout << "Hello, World!\n"; }
};


template <>
class MyClass<City> {
public:
    static void function() { launchRockets(); }
};

実行可能なプログラムです。

あなたが書いMyClass::function()た場合、それはバグダッドを全滅させるべきですか、それとも友好的なメッセージを印刷するべきですか?


もちろん、この関数が印刷以外のことを行う理由がない場合は、おそらくそれ自体が関数である必要があります。

void function() { std::cout << "Hello, World!\n"; }

これは単純に で呼び出されますfunction()。クラスがないのでさらに短いです!

于 2012-05-16T18:34:46.833 に答える
5

あなたがこれを持っていたと想像してください:

template <typename T> struct Foo
{
    static void boom()
    {
        static int n = 0;
        std::cout << ++n << std::endl;
    }
};

と言うとどうなるか想像しFoo<int>::boom(); Foo<int>::boom();て、まったく同等ではない と比較してくださいFoo<int>::boom(); Foo<char>::boom();

于 2012-05-16T18:39:50.737 に答える
2

を と考えないでtemplateくださいclass。これは、クラスが構築される単なるスケルトンです。

MyClass::function()MyClassは特殊化しない限り実際のクラスではないため、意味がありません。

MyClass<int>::function();MyClass<char>::function();テンプレート パラメーターに依存しない可能性があり、同じように動作する可能性がありますが、同じ関数ではありません。

バイナリを見てみましょう。

    MyClass<int>::function();
00D617CE  call        MyClass<int>::function (0D611C2h) 
    MyClass<char>::function();
00D617D3  call        MyClass<char>::function (0D611C7h) 

このために、 の空の定義を提供したfunctionので、テンプレート パラメータに依存しません。ご覧のとおり、2 つの機能は異なります。

これは、コンパイラによって生成された 2 つのクラス (MyClass<int>MyClass<char>.

于 2012-05-16T18:28:41.963 に答える