2

は、私は関数テンプレートがあるとします。私は特化したり、過負荷にするべきですか?

template <typename T> 
std::string foo(const T& x) 
{ 
    return some_computation_involving(x); 
} 

xがすでに文字列である場合、私はちょうどそのまま戻ってそれを渡したいです。私は関数テンプレートを特化すべきですか?

template <> 
std::string foo(const std::string& x) 
{ 
    return x; 
} 

また、テンプレート以外の機能を用意する必要がありますか?

どのような状況で、私はどのようなオプションを選択すればいいですか、私は注意すべき落とし穴は何ですか?

+0

私は過負荷が専門の切り札と無視するよう回避するために重要な落とし穴が専門と過負荷の両方をしていると信じています。 – AJG85

+0

あなたはfoo (arg)のようなメソッドを呼び出さないでしょうか?その場合、たとえそれが文字列であることがわかっていれば、メソッドを呼び出すのはなぜですか? –

+0

@Sriram:一般的ではありません。テンプレートパラメータは引数から推論できます。さらに、テンプレート化された関数からルーチンを呼び出すことを検討してください。 'foo (arg)'は文字列を渡すかもしれません。 –

答えて

3

できるだけオーバーロードを選択してください。関数テンプレートの特殊化は、変な雌犬です。たとえば、専門化を決定する際に、共分散を含む暗黙的な変換は考慮されません。

編集:あなたが何かのように、

template<typename T> void func(T t); 
template<> void func(base*); 

int main() { 
    func(new derived); 
} 

を行う場合たとえば、専門は呼び出されません。それが過負荷であれば、それは呼び出されるでしょう。

+0

拡張できますか共分散問題について? – fredoverflow

+2

私は*共分散*はここでは適切な用語ではないと思う... *継承*より良いものになります。 –

+0

オーバーロードが呼び出されますか? [ideone](http://ideone.com/OA22W)と[この質問](http://stackoverflow.com/q/7765562/20984)によると、もう私はそれほど確信していません。 –

関連する問題