模板别名在简化 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 还是别名。
别名 specification要求您使用 type-id 来指定先前定义的类型。在这种特殊情况下,正确使用 type-id 将如下所示:
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
作为 type-id。这是不正确的。
可能您想以某种方式推断出 T
来自 F
的参数用于 template map<T>
但这不适用于您的最终用例 fun<neg<pred>>
其中 T
没有解决。
关于c++ - 嵌套模板的模板模板别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18699973/