2017-12-27 5 views
-1

私は2つの機能を宣言している:関数が使用されている、テンプレートかどうか?

template<typename T> 
void foo(T& in) { cout << in; } 
void foo(bool& b) { cout << "Bool:" << (b ? "True" : "False");} 

は、私はこのような関数を呼び出しています:

bool var = false; foo(var); 

私はテストコードを書くことができます知っています。しかし、これがコンパイラ依存の選択である場合は、 テストコードを書くことで完全なカバレッジが得られることはありません。

+0

私は次のように呼び出します。bool var = false; foo(var); – xjsXjtu

+1

コンパイラに依存する選択肢であれば、どのようにして1つの答えを得ることができますか? – Vivick

+2

コンパイラに依存しません(コンパイラにエラーがない限り)。テンプレートとnin-templateが同じように一致する場合は、non-templateが優先されます。 BTWでは 'out << std :: boolalpha << true;を使って' bool'を文字列としてフォーマットすることができます(フラグはリセットされるまで適用されます)。デフォルトでは 'true'(または' false')のように書式化されます。本当に必要な場合は、カスタムのstd :: numpunct ファセットを使用して文字列を変更できます。 –

答えて

1

通常、オーバーロードの解像度は、テンプレート関数以外のテンプレート関数を優先します。したがって、bool&バージョンが呼び出されます。これは明確に定義されており、コンパイラが決定するまでではありません。

詳しくは、cppreferenceの「Best Viable Function」のセクションを参照してください。 (私は標準にリンクしてみてください可能性がありますが、おそらく読むことさえ難しくなります。)

2

を秒1、すなわち:

void foo(bool& b) { cout << "Bool:" << (b ? "True" : "False");} 

それはbool var = false; foo(var);のためのより良い試合になるため。

一般に

あなたはrefで読むことができるように、過負荷解像度は、テンプレートのものにわたって非テンプレート化方法を好む:

ベスト実行可能な機能

F1がより良い機能であると判断されましたF2 暗黙の変換の場合:

F1はテンプレート以外の関数ですが、F2はテンプレートの特殊化です


PS:私は上記のようにオーバーロード解決は、このような場合に発生する方法について説明したルールがあるので、これは、ないコンパイラに依存しています。

関連する問題