1

特定の型がテンプレート型であるかどうかを推測できるようにしたいと考えています。ブーストの型特性クラスを調べましたが、テンプレートに関連する is_* 特性が見つかりません: http://www.boost.org/doc/libs/1_52_0/libs/type_traits/doc/html/index.html

さらに興味深いのは、テンプレート パラメーターの数やパラメーターがテンプレート テンプレート パラメーターであるかどうかなど、テンプレート パラメーターのプロパティをコンパイル時に決定する方法がある場合です。

4

1 に答える 1

4

部分的な解決策は次のとおりです。

#include <iostream>
#include <type_traits>

template <typename> struct is_template : std::false_type {};

template <template <typename...> class Tmpl, typename ...Args>
struct is_template<Tmpl<Args...>> : std::true_type {};


template <typename> struct Foo {};

int main()
{
  std::cout << is_template<int>::value << std::endl;
  std::cout << is_template<Foo<char>>::value << std::endl;
}

問題は、テンプレートが任意の構造を持つことができるため、型パラメーターだけで構成される必要がないことです。すべての種類のテンプレート引数を網羅的に列挙することはできません。

ただし、このアプローチを 1 分間続けると、引数のカウンターがすぐに作成されます。

template <typename> struct nargs : std::integral_constant<unsigned int, 0> { };

template <template <typename...> class Tmpl, typename ...Args>
struct nargs<Tmpl<Args...> : std::integral_constant<unsigned int, sizeof...(Args)> { };
于 2012-12-17T17:47:22.973 に答える