嵌套模板的模板模板别名?

Posted

技术标签:

【中文标题】嵌套模板的模板模板别名?【英文标题】:template template alias to a nested template? 【发布时间】:2013-09-09 13:59:05 【问题描述】:

模板别名非常方便将typename F <T>::type 等类型简化为F <T>,其中Ttype 是类型。

我想对F <T>::map 之类的模板做同样的事情,即将它们简化为F <T>,其中Tmap 是模板结构或别名。

例如,考虑以下定义:

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 &lt;F&gt;::template map 而失败)。看来上面neg的定义宁可像“模板模板别名”

template <template <typename> class F>
template <typename T>
using neg = neg_f <F>::template map <T>;

但显然没有这样的东西。

那么,有什么解决方案还是我应该留在neg_f &lt;pred&gt;::map

【问题讨论】:

我问了一个类似的问题***.com/questions/17356487/…,似乎没有一个好的答案。 确实,您问题的最后一部分非常相似或相同。谢谢。 由于某些原因,您在&lt; 之前使用空格会使所有内容读起来非常不愉快。 @Jeffrey 对此我深表歉意。另一方面,我会觉得template&lt;template&lt;typename&gt; class F&gt; 非常不愉快; template&lt; template&lt; typename &gt; class F &gt; 也是。在括号前使用空格是非常标准的,例如if (x &lt; 0),所以&lt; 之前的空格对我来说看起来很自然。 我不明白那些 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&lt;F&gt;::map作为 type-id。这是不正确的。

您可能想以某种方式从F 中推断出T 参数以用于template map&lt;T&gt;,但这不适用于您的最终用例fun&lt;neg&lt;pred&gt;&gt;,其中T 未解析。

【讨论】:

所以错误列表显示了根本原因。查看我对答案的修改。 我没有尝试使用模板名称 neg_f::map 作为类型 ID。你做到了。 这是您尝试使用模板名称 neg_f &lt;F&gt;::map 作为类型 ID ;) template &lt;template &lt;typename&gt; class F&gt; using neg = neg_f &lt;F&gt;::map 如果您阅读整个句子,这是说明问题的假设代码。无论如何,我删除了反对票。

以上是关于嵌套模板的模板模板别名?的主要内容,如果未能解决你的问题,请参考以下文章

模板别名、变量模板和自动类型推导无法推导模板参数

模板模板参数和模板别名:编译器错误?

如何编写聚合模板别名的推导指南?

别名模板的包扩展

C++ Primer 5th笔记(chap 16 模板和泛型编程)模板类型别名

[C++11]使用using和typedef给模板定义别名