c++ - 嵌套模板的模板模板别名?

标签 c++ templates c++11 template-aliases

模板别名在简化 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> >

(它也因 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/

相关文章:

c++ - 编译时的 std::experimental::source_location

c++11 - 在 VS 2015 中为 const vector<const T> 报告了编译器错误,但在 VS 2013 中没有

windows - C++11:如何实现快速、轻量级、公平的同步资源访问

c++ - 如何将 g++ 和 gtest 集成到一个 cmake 文件中

c++ - 调试程序集时,如何在 VS2019 watch 窗口中将内存地址转换为用户定义的类型?

c++ - 无法在 device_memory 中创建 cusp::coo_matrix 的 thrust::host_vector?

javascript - Knockout.JS ,模板是通过表单没有添加任何数据

javascript - 如何在meteor.js中找到模板变量来自哪里

c++ - 运算符同时重载 = 和 []

c++ - 指向函数中局部变量的全局指针