嵌套模板的模板模板别名?
Posted
技术标签:
【中文标题】嵌套模板的模板模板别名?【英文标题】:template template alias to a nested template? 【发布时间】: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
?
【问题讨论】:
我问了一个类似的问题***.com/questions/17356487/…,似乎没有一个好的答案。 确实,您问题的最后一部分非常相似或相同。谢谢。 由于某些原因,您在<
之前使用空格会使所有内容读起来非常不愉快。
@Jeffrey 对此我深表歉意。另一方面,我会觉得template<template<typename> class F>
非常不愉快; template< template< typename > class F >
也是。在括号前使用空格是非常标准的,例如if (x < 0)
,所以<
之前的空格对我来说看起来很自然。
我不明白那些 neg_f 和其他东西代表什么,如果你描述得更好,也许我们可以想出一个解决方案
【参考方案1】:
首先考虑使用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>;
您最初尝试做的是使用 template-name neg_f<F>::map
作为 type-id。这是不正确的。
您可能想以某种方式从F
中推断出T
参数以用于template map<T>
,但这不适用于您的最终用例fun<neg<pred>>
,其中T
未解析。
【讨论】:
所以错误列表显示了根本原因。查看我对答案的修改。 我没有尝试使用模板名称 neg_fneg_f <F>::map
作为类型 ID ;) template <template <typename> class F> using neg = neg_f <F>::map
如果您阅读整个句子,这是说明问题的假设代码。无论如何,我删除了反对票。以上是关于嵌套模板的模板模板别名?的主要内容,如果未能解决你的问题,请参考以下文章