テンプレートインスタンス化に渡される名前は既に定義されていなければならないため、残念なことに、望ましい構文は使用できません。あなたのケースでは、myType1
とmyType2
は、コンパイラの観点から何も名をつけません。しかし、あなたが次のようにstd::enable_if
を使用しようとする可能性が言及した構文を主張していない場合:
#include <type_traits>
struct A {
struct myType1: std::enable_if<true, int> { }; //std::conditional_typedef<true,int,myType1>; // Performs "typedef int myType1".
struct myType2: std::enable_if<false, int> { }; //std::conditional_typedef<false,int,myType2>; // Does nothing at all.
};
int main() {
A::myType1::type i;
//A::myType2::type i2; // causes error: no type named 'type' in 'A::myType2'
(void)i;
}
[live demo]
編集:
さらに別の方法私の頭に浮かんだ(デフォルトテンプレートパラメータを使用して利用する):
#include <type_traits>
struct A {
template <class T = int>
using myType1 = typename std::enable_if<true, T>::type;
template <class T = int>
using myType2 = typename std::enable_if<false, T>::type;
};
int main() {
A::myType1<> i;
//A::myType2<> j;
(void)i;
}
[live demo]
理論的な 'if(...)typedef ...;'というコード例を提供できますか?特に、typedefが「実行されていない」場合、typedefを使用するコードではどうなりますか? – Quentin
[std :: enable_if](http://en.cppreference.com/w/cpp/types/enable_if) – Danh
条件の特殊化に応じて十分かもしれません... –