タイプがいくつかの条件に依存する変数を定義したいと思います。私はこのような何かしたい:typedefとともにenable_ifを使用できますか?
typedef typename enable_if<cond, int>::type Type;
typedef typename enable_if<!cond, double>::type Type;
をしかしconpilerは、私はタイプを再定義と言います。
どうすればいいですか?
タイプがいくつかの条件に依存する変数を定義したいと思います。私はこのような何かしたい:typedefとともにenable_ifを使用できますか?
typedef typename enable_if<cond, int>::type Type;
typedef typename enable_if<!cond, double>::type Type;
をしかしconpilerは、私はタイプを再定義と言います。
どうすればいいですか?
あなたが使用する必要がありますstd::conditional
:
#include <type_traits>
// c++11:
typedef typename std::conditional<cond, int, double>::type Type;
// c++14:
typedef std::conditional_t<cond, int, double> Type;
は、C++ 11以降あなたは(私の意見では少しクリーナー)タイプとテンプレートエイリアスのためusing
キーワードを使用できることに注意してください。
// c++11
using Type = typename std::conditional<cond, int, double>::type;
// c++14
using Type = std::conditional_t<cond, int, double>;
typedefと一緒に
enable_if
を使用できますか?
いいえできません。条件がfalseの場合、std::enable_if
は型を未定義のままにします。条件が真である場合のみ、メンバーtype
が定義されています。
template< bool B, class T = void > struct enable_if;
B
がtrue
場合、std::enable_if
はT
に等しいパブリックメンバのtypedef型を有します。それ以外の場合は、メンバーtypedefはありません。
typedefが正しく機能するためには、条件がtrueの場合とfalseの場合の両方の型が必要です。 SFINAEに関連するシナリオを支援するためにenable_if
が実装されています。
それでは
どのように私はこれを行うことができますか?
std::conditional
を使用してください。条件には、true
とfalse
の両方の結果のメンバtypedef(type
)が含まれます。
template< bool B, class T, class F > struct conditional;
は
B
がコンパイル時にtrue
ある場合、又はF
としてB
がfalse
であればT
として定義されるメンバーのtypedef型を提供します。
したがって、次のことで十分です。
typedef typename std::conditional<cond, int, double>::type Type;
またはそれ以上の短縮;
using Type = std::conditional_t<cond, int, double>;
SFINAEをtypedefで使用することは実際には法的ではありません。 'テンプレートクラスC {typedef std :: enable_if ::値、タイプ> }; '? –
Flexo
実際はありません。 https://godbolt.org/g/2YT04Q。私はテンプレートの控除の直後の文脈の外でそれを実際に見たこともありませんでした。この問題は、条件がfalseの場合に起こります。typedefには、エイリアスの型がありません。 SFINAEは、関数テンプレートのオーバーロードを解決するために使用されます。http://en.cppreference.com/w/cpp/language/sfinae – Niall