typename F <T>::type
テンプレート エイリアスは、 just F <T>
、 where T
、type
are などの型を単純化するのに非常に便利です。
のようなテンプレートについても同じことをしたいと思います。つまり、とはテンプレート構造体またはエイリアスF <T>::map
に単純化します。F <T>
T
map
たとえば、次の定義を検討してください。
template <bool B>
using expr = std::integral_constant <bool, B>;
template <bool B>
using _not = expr <!B>;
template <template <typename> class F>
struct neg_f
{
template <typename T>
using map = _not <F <T>{}>;
};
template <typename T>
pred = expr < /* ... T ... */ >; // e.g., pred = expr <true>;
template <template <typename> class F>
struct fun;
現在、次のように機能します。
fun <neg_f <pred>::map>
これははるかに便利ですが、失敗します:
template <template <typename> class F>
using neg = neg_f <F>::map;
fun <neg <pred> >
(が構造体として定義されていneg = neg_f <F>::template map
ても、 で失敗します)。map
上記の定義はneg
、「テンプレート テンプレート エイリアス」のようにする必要があるようです。
template <template <typename> class F>
template <typename T>
using neg = neg_f <F>::template map <T>;
しかし、明らかにそのようなことはありません。
それで、解決策はありますか、それとも一緒にいるべきneg_f <pred>::map
ですか?