2017-09-15 4 views
0

以下の方法の主な違いは何ですか? std::to_stringが定義されている場合、2つのうちの1つが問題を引き起こすケースはありますか?1つのテンプレート特殊化だけが役に立ちますか?

include <string> 
using namespace std; 


enum class eColor 
{ 
    Red 
}; 

void to_string(eColor color) 
{ 
} 

template<typename C = eColor) 
void to_string(C color) 
{ 
} 



int main() 
{ 
    to_string(eColor::Red); // assume only one of the above is defined 
    return 0; 
} 

上記のいずれかが望ましい場合はありますか?

テンプレート機能が自動的にテンプレート引数を推測:あなたはto_stringような名前を使用する予定がある場合は特に奇妙である、あなたのusingディレクティブにより、名前空間の不必要な汚染のようなものにもかかわらず

+0

テンプレートが混乱を招きます。 https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice – juanchopanza

+0

も参照してください。なぜテンプレートを使用したいのですか? – juanchopanza

+0

私はテンプレートバージョンのために多くの点を見ません。しかし、あなたの例は単純化されているので、実装を示すべきです。 – user0042

答えて

0

。だから、次は絶対に有効になります:

だから、
int main(int argc, const char * argv[]) { 
    to_string(eColor::Red); 
    to_string("Hey"); 
    to_string(42); 
    return 0; 
} 

あなたが本当にあなたには、いくつかの本当に面白いのエラーメッセージや不要な行動と組み合わせるさらに悪くありませんエラーメッセージの中にある1つの専用タイプのためにテイラーにあなたの機能を計画している場合。

関数バージョンでは、誤ったケースを防ぐことができます。 (暗黙的な変換があるので、まだ42を受け付けます)。

1

あなたの関数to_string(eColor color)は、定義の前にテンプレート<が欠落しているため、実際にテンプレートの特殊化ではありません。したがって、コンパイラは、それを完全に定義された関数として扱い、具体的な型で生成するテンプレートではありません。つまり、コンパイラが引数リストと一致する限り、この関数が常に使用されます。

関連する問題