2016-10-02 13 views
3

クラスが通常型であるかテンプレート型(メタ型)であるかを検出する方法はありますかこれには非型パラメータが含まれていますか?それは非種類やタイプを混在テンプレートに失敗しますがタイプと非タイプを混在させる任意のテンプレートクラスを検出する方法はありますか?

template<class, int> struct MixedFoo{}; 

のように私は1つを除いて、いずれかの解決策を考え出すことができませんよ、

#include <iostream> 

template <template<class...> class> 
constexpr bool is_template() 
{ 
    return true; 
} 

template <class> 
constexpr bool is_template() 
{ 
    return false; 
} 

struct Foo{}; 

template<class> struct TemplateFoo{}; 

template<class, int> struct MixedFoo{}; 

int main() 
{ 
    std::cout << std::boolalpha; 
    std::cout << is_template<Foo>() << std::endl; 
    std::cout << is_template<TemplateFoo>() << std::endl; 
    // std::cout << is_template<MixedFoo>() << std::endl; // fails here 
} 

:私はこの解決策を考え出しました私は明示的に過負荷の種類を指定する必要があります。もちろん、これはコンビナトリアルな爆発のために妥当ではありません。

関連質問(ないデュープ):Is it possible to check for existence of member templates just by an identifier?

+1

悲しいことに[C++ 17でもない](http://melpon.org/wandbox/permlink/VAUXmYQ6tM5L2GOh)は、必要な組み合わせの数を減らすようです。 –

答えて

4

いいえ、ありません。

テンプレートクラスはクラスそのものではありません。それらはクラスのテンプレートです。

+0

はい、テンプレートクラスは型自体ではなくメタ型であることはわかっています。それでも、型のないパラメータを取る場合を除いて、通常の型と区別することができます。私は誰かがそれをやる方法を思いつくかもしれないと思った。 – vsoftco

+0

@vsoftあなたの質問(テンプレートクラスをクラスと呼ぶ)のマイナーエラーのために2番目の段落を追加しましたが、主に最初の段落が答えが短すぎるためです。 ;) – Yakk

1

私はそれができないと思います。

とにかく、あなたは他の方法で回避を使用してNを推定することさせることができます:

template<class, class> struct MixedFoo; 
template<class C, int N> struct MixedFoo<C, std::integral_constant<int, N>>{}; 

、予想通り、これはtrueを返します。もちろん

std::cout << is_template<MixedFoo>() << std::endl; // fails here 

を、あなたはできませんもはやMixedFooMixedFoo<int, 2>として使用するようになったので、それはそれが価値があるかどうかはわかりません。

関連する問題