7

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生成された余分なsを取り除くために使用できる同等のものはありますか?

出力が型ではなくクラスまたはエイリアス テンプレートであるメタ関数があるとします。現在の方法は次のようなものです。

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 >();
};
4

1 に答える 1