部分的な解決策は次のとおりです。
#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)> { };