首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板模板别名为嵌套模板?

模板模板别名为嵌套模板?
EN

Stack Overflow用户
提问于 2013-09-09 13:59:05
回答 1查看 1.5K关注 0票数 10

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

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

例如,考虑以下定义:

代码语言:javascript
复制
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;

现在有以下工作:

代码语言:javascript
复制
fun <neg_f <pred>::map>

这样做会方便得多,但却失败了:

代码语言:javascript
复制
template <template <typename> class F>
using neg = neg_f <F>::map;

fun <neg <pred> >

( neg = neg_f <F>::template map也会失败,即使map被定义为一个结构)。以上neg的定义似乎更像是一个“模板别名”。

代码语言:javascript
复制
template <template <typename> class F>
template <typename T>
using neg = neg_f <F>::template map <T>;

但显然不存在这样的事情。

那么,有什么解决方案吗?还是我应该继续使用neg_f <pred>::map

EN

回答 1

Stack Overflow用户

发布于 2014-04-11 10:05:06

首先,考虑使用typename关键字来声明这是一个嵌套类型,而不管是类型(例如struct、class等)、模板类型、ty对联或别名。

别名规格说明要求您使用类型id来指定先前定义的类型。在这种情况下,正确使用type-id如下所示:

代码语言:javascript
复制
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作为类型id。这不对。

您可能想从F中推断出F参数,以便在template map<T>中使用,但这不适用于最终用例fun<neg<pred>>,其中T未被解析。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18699973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档