10

模板别名在简化类型时非常方便,例如typename F <T>::typejust F <T>、 whereTtypeare 类型。

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

例如,考虑以下定义:

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

4

1 回答 1

1

首先考虑使用typename关键字来声明这是一个嵌套类型,无论它是一个类型(例如结构、类等)、模板类型、typedef 还是别名。

别名规范要求您使用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。这是不正确的。

可能您想以某种方式推断要使用的T参数,但这不适用于您未解决的最终用例。Ftemplate map<T>fun<neg<pred>>T

于 2014-04-11T10:05:06.277 回答