“模板”的“使用”别名的等价物

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吗?

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

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关键字来消除我的元函数的返回值是我想要消除的。

是否有任何方式向编译器指出,在不使用调用位置处的template关键字的情况下,元计算的结果是C ++ 11或C ++ 1y中的另一个别名或类模板?

即:

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最佳方法是制作简单的修整器,它可以为您做到这一点:

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> >();
};
链接地址: http://www.djcxy.com/p/14483.html

上一篇: Equivalent of `using` aliases for `template`s

下一篇: size in a div after selecting the text only in that div