В настоящее время я пишу метафункцию для оценки выражений, что-то вроде boost::mpl::apply:
template<typename EXPRESSION , typename... ARGS>
using eval = typename eval_impl<EXPRESSION,ARGS...>::result;
Как видите, я использую псевдонимы шаблонов C++11, чтобы не писать typename ::result
при использовании оценщика.
Среди других специализаций eval_impl
(реализация метафункции оценки) имеет специализацию для случая, когда пользователь передает параметризованное выражение (такое как метафункция) и набор параметров. Другими словами, для использования eval
в качестве метафункции высокого порядка для оценки метафункции с набором указанных параметров.
Для этого случая я написал специализацию следующим образом:
template<template<typename...> class F , typename... PLACEHOLDERS , typename... ARGS>
struct eval_impl<F<PLACEHOLDERS...>,ARGS...> : public F<ARGS...> {}
Теперь рассмотрим вариант использования:
template<typename ARG , typename... ARGS> using first_of = ARG;
using call = eval<first_of<_1,_2,_3,_4> , bool,float,char,int>;
Здесь мы определяем пользовательскую метафункцию first_of
как псевдоним шаблона и передаем ее в eval
вместе с набором параметров, которые будут вызываться (оцениваться). _1
, _2
... просто заполнители.
Я ожидал, что eval
вызывает экземпляры со специализацией, определенной выше, но это не так. И если тип с псевдонимом — это не сам тип, а шаблон с одним параметром, GCC 4.8.1 говорит:
Ошибка: ожидался один параметр шаблона, предоставлено два
В момент создания этой eval_impl
специализации.
Так что ошибки наводят меня на мысль, что псевдоним шаблона не берется в параметре шаблона шаблона частичной специализации, вместо этого сопоставляется псевдоним типа.
Как вы можете видеть в примерах, это не то, чего я не хочу, мне нужно, чтобы псевдоним шаблона соответствовал любой другой метафункции. Есть ли способ добиться этого?
std::tuple
) и метафункцию отдельно. - person dyp   schedule 08.04.2014