В момента пиша метафункция за оценка на изрази, нещо като 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