2017-01-11 8 views
0

私は関数int foo()を持っています、そして、私は、以下の2つの異なるモードを持っているといいと思います。既存の関数をテンプレートでオーバーロードするのは悪い習慣ですか?

template<typename T> 
int foo() { doDefaultStuff; } 

template<> int foo<FastMode> { doFastStuff; } 

はその後、私は

if (enable_fast_mode) 
    a = foo<FastMode>(); 
else 
    a = foo<>(); 

ように私のテンプレートを起動しようとする。しかしno matching function for call to 'foo()'

が、それは悪い習慣が両方int foo()template<> int foo()、 を宣言するか、私がすべきであるとしてelse部分はコンパイルされませんint foo<void>()でデフォルトモードを起動しますか?

enum class Mode 
{ 
    Slow, 
    Fast, 
    Default 
}; 

template<Mode T = Mode::Default> 
int foo() { ...; } 

template<> 
int foo<Mode::Fast>() { ...; } 

これはMode::Defaultにそれがデフォルトであるため可能foo<>()のような呼び出しを行う:あなたはこのような何かを行うことができ、あなたの特定の問題については

+0

それは悪い習慣ではありません*それだけでは、それを達成するためのより良い方法があります。 – Rakete1111

+2

'foo()'と 'fastfoo()'だけではないのはなぜですか?テンプレートは何を得ますか? –

+0

これは過負荷ではありません。それは専門です。テンプレート引数はオプションではなく、あなたはそれを提供していないので、 "高速"と "デフォルト"は間違った名前です。私はColinと同意します。テンプレートは、あなたが現在使っていないパラメータのうちの1つで控除を利用することを計画していない限り、無意味に見えます。 – WhozCraig

答えて

3

+2

upvoteは私よりも10秒早いです:)また、 'foo'を呼び出すときに' <> 'を指定する必要はなく、' foo() 'だけを使用します。 – Rakete1111

0

一般的な機能に答えるには、関数テンプレートを特化することは推奨されません。こちらはarticleです。オーバーロードと特殊化を混在させると予期しない状況に遭遇することがあります。記事のDimov/Abrahamsの例を参照してください。

関連する問題