шаблон шаблона псевдоним вложенного шаблона?

Псевдонимы шаблона очень удобны для упрощения типов, таких как typename F <T>::type чтобы просто F <T>, где T а также type типы.

Я хотел бы сделать то же самое для шаблонов, таких как 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 ?

9

Решение

Сначала рассмотрите возможность использования typename ключевое слово, указывающее, что это вложенный тип, независимо от того, является ли он типом (например, структура, класс и т. д.), типом шаблона, typedef или псевдонимом.

кличка Спецификация требует от вас использовать тип-идентификатор указать ранее определенный тип. В этом конкретном случае правильное использование тип-идентификатор будет выглядеть так:

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>;

То, что вы пытаетесь сделать изначально, это использовать Имя Шаблона neg_f<F>::mapкак тип-идентификатор. Это не правильно.

Возможно, вы хотите как-то вывести T параметр из F использоваться в template map<T> но это не относится к вашему последнему варианту использования fun<neg<pred>> где T не разрешено

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]