Scott Meyersは、彼の次の本 EC++11 の内容とステータスを投稿しました。彼は、本の 1 つの項目が「関数シグネチャで回避する」std::enable_if
である可能性があると書いています。
std::enable_if
関数の引数、戻り値の型、またはクラス テンプレートまたは関数テンプレート パラメーターとして使用して、関数またはクラスをオーバーロードの解決から条件付きで削除できます。
この質問では、3 つのソリューションすべてが示されています。
関数パラメータとして:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
テンプレート パラメータとして:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
戻り型として:
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- どのソリューションを優先する必要があり、他のソリューションを避ける必要があるのはなぜですか?
- 「関数シグネチャでの回避
std::enable_if
」が戻り値の型 (通常の関数シグネチャの一部ではなく、テンプレートの特殊化の一部である) としての使用に関係するのはどの場合ですか? - メンバー関数テンプレートと非メンバー関数テンプレートに違いはありますか?