【发布时间】:2013-09-09 13:59:05
【问题描述】:
模板别名非常方便将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> >
(即使map 被定义为结构,它也会因neg = neg_f <F>::template map 而失败)。看来上面neg的定义宁可像“模板模板别名”
template <template <typename> class F>
template <typename T>
using neg = neg_f <F>::template map <T>;
但显然没有这样的东西。
那么,有什么解决方案还是我应该留在neg_f <pred>::map?
【问题讨论】:
-
我问了一个类似的问题stackoverflow.com/questions/17356487/…,似乎没有一个好的答案。
-
确实,您问题的最后一部分非常相似或相同。谢谢。
-
由于某些原因,您在
<之前使用空格会使所有内容读起来非常不愉快。 -
@Jeffrey 对此我深表歉意。另一方面,我会觉得
template<template<typename> class F>非常不愉快;template< template< typename > class F >也是。在括号前使用空格是非常标准的,例如if (x < 0),所以<之前的空格对我来说看起来很自然。 -
我不明白那些 neg_f 和其他东西代表什么,如果你描述得更好,也许我们可以想出一个解决方案
标签: c++ templates c++11 template-aliases