模板别名在简化类型时非常方便,例如typename F <T>::type
just F <T>
、 whereT
和type
are 类型。
我想对模板做同样的事情,即将F <T>::map
它们简化为F <T>
、 whereT
和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
?