10

typename F <T>::typeテンプレート エイリアスは、 just F <T>、 where Ttypeare などの型を単純化するのに非常に便利です。

のようなテンプレートについても同じことをしたいと思います。つまり、とはテンプレート構造体またはエイリアスF <T>::mapに単純化します。F <T>Tmap

たとえば、次の定義を検討してください。

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ですか?

4

1 に答える 1

1

まず、typenameキーワードを使用して、型 (構造体、クラスなど)、テンプレート型、typedef、エイリアスのいずれであっても、これがネストされた型であることを示すことを検討してください。

エイリアスの指定では、 type-idを使用して以前に定義されたタイプを指定する必要があります。この特定のケースでは、type-idを正しく使用すると次のようになります。

template< template<typename> class F, class T>
using neg_v2 = typename neg_f<F>::template map<T>;

// or

struct foo {};
template< template<typename> class F>
using neg_v1 = typename neg_f<F>::template map<foo>;

もともとやろうとしているのは、template-name neg_f<F>::maptype-idとして使用することです。これは正しくありません。

Tおそらく、パラメーターFが at で使用されることを何とか推測したいでしょうtemplate map<T>が、これは解決されていない最終的なユースケースfun<neg<pred>>Tは当てはまりません。

于 2014-04-11T10:05:06.277 に答える