Псевдонимы шаблона очень удобны для упрощения типов, таких как 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
?
Сначала рассмотрите возможность использования 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
не разрешено
Других решений пока нет …