c++ - 相当于 `using` s 的 `template` 别名

标签 c++ templates c++11 c++14 using

C++11 添加了别名模板,例如:

 template<typename T> using identity = T;
 template<bool b, typename T = void> using EnableIf = typename std::enable_if<b, T>::type;

这些比旧的 template 类型映射更容易使用,后者在 ::type 字段中为您提供返回值,因为即使您的类型参数依赖于本地上下文,您不需要通知编译器结果是一个类型。

实际上,您将 typename 从使用位置提升到 using 别名。

是否有任何等效的东西可以用来摆脱产生的无关模板

假设您有一个元函数,其输出是类或别名模板而不是类型。目前的方法是这样的:

template<typename T>
struct my_meta {
  template<typename U>
  using Template = identity<U>;
};

template<typename T>
struct my_meta {
  template<typename U>
  using Template = int;
};

然后我们可以这样使用:

template<typename T, typename U>
typename my_meta<T>::template Template<U>
do_stuff( U&& ) { return {}; }

返回类型中额外的 template 关键字的存在是为了消除我的元函数的返回值的歧义,这是我想要消除的。

有没有办法向编译器指示元计算的结果是 C++11 或 C++1y 中的另一个别名或类模板,而无需在该位置使用 template 关键字调用?

即:

template<typename T, typename U>
my_meta_template<T><U>
do_stuff( U&& ) { return {}; }

甚至

template<template<typename> class Template>
void do_more_stuff() {}

template<typename T>
void do_stuff() {
  // syntax I want: just produce an alias or class template directly:
  do_more_stuff< my_meta_template<T> >();
  // vs what I find is required: the disambiguator:
  do_more_stuff< my_meta<T>::template Template >();
};

最佳答案

我知道删除 template 的最佳方法是一个简单的 warper,可以为你做这件事:

template<typename Meta, typename U>
using apply = typename Meta::template Template<U>;

以及您之前使用过的每个地方 template<typename> class Template将其替换为 typename Meta .

template<typename Meta>
void do_more_stuff()
{
    apply<Meta, int>::func(); //=== Meta::template Template<int>::func();
}

template<typename T>
void do_stuff() {
  do_more_stuff< my_meta<T> >();
  do_more_stuff< my_meta<T> >();
};

关于c++ - 相当于 `using` s 的 `template` 别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17356487/

相关文章:

c++ - 更改程序中的访问说明符是否会改变程序的行为?

c++ - 数组与 std::initializer_list 作为函数参数

arrays - 修改 std::array 所有元素的优雅而有效的方法

c++ - 终止 worker

jquery - 我想创建一个带虚线的有序列表,指示文件的大小。怎么办?

c++ - 如何使用 (*mpORBextractorLeft)(in,cv::Mat(),monKeys,Descriptors);

c++ - 如何找出键盘的地址

C++ 奇怪的行为 Visual Studio

c++ - 模板定义语法

c++ - 使用可重写的处理函数构建类层次结构