スコットマイヤーズは、彼の次の本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
機能シグネチャの」(通常の関数シグネチャのが、テンプレート特殊化の一部ではない)戻り型などの懸念の使用? - メンバー関数テンプレートと非メンバー関数テンプレートに違いはありますか?
std::enable_if
、関数のシグネチャ(特に、醜い追加のnullptr
関数の引数のバージョン)は乱雑にしたくありませstatic if
ん。テンプレートブラックマジックを使用して、魅力的な言語機能を活用することで、はるかに美しくクリーンに実行できます。これが、可能な場合はいつでもタグディスパッチを好む理由です(まあ、まだ奇妙な引数がありますが、パブリックインターフェイスではなく、醜くて不可解です)。
=0
でtypename std::enable_if<std::is_same<U, int>::value, int>::type = 0
成し遂げるのかですが?それを理解するための正しいリソースが見つかりませんでした。私は、最初の部分は前に知っている=0
メンバーの種類を持っているint
場合U
とint
同じです。どうもありがとう!