相当于`using`别名为`template`s

Yak*_*ont 7 c++ templates using c++11 c++14

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

 template<typename T> using identity = T;
 template<bool b, typename T = void> using EnableIf = typename std::enable_if<b, T>::type;
Run Code Online (Sandbox Code Playgroud)

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

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

有没有什么可以用来摆脱生产无关的templates?

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

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;
};
Run Code Online (Sandbox Code Playgroud)

我们可以这样使用:

template<typename T, typename U>
typename my_meta<T>::template Template<U>
do_stuff( U&& ) { return {}; }
Run Code Online (Sandbox Code Playgroud)

template返回类型中的额外关键字存在以消除我的元函数的返回值的歧义是我想要消除的.

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

即:

template<typename T, typename U>
my_meta_template<T><U>
do_stuff( U&& ) { return {}; }
Run Code Online (Sandbox Code Playgroud)

甚至

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 >();
};
Run Code Online (Sandbox Code Playgroud)

Yan*_*kes 3

我知道的最好的删除方法template是制作简单的扭曲器,它可以为你做到这一点:

template<typename Meta, typename U>
using apply = typename Meta::template Template<U>;
Run Code Online (Sandbox Code Playgroud)

并将您以前使用过的每个地方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> >();
};
Run Code Online (Sandbox Code Playgroud)