8

type_traitsクラスを作成して、2つのタイプが同じテンプレートクラスの特殊化であるかどうかを検出する方法を知りたいと思います。大きな問題は、混合型/非型テンプレートクラスのように動作するはずです:2つのタイプが同じクラステンプレートの特殊化であるかどうかを検出しますか?

template <typename T, std::size_t N> 
class MyClass {}; 

このようなものを設計することは可能ですか?

+0

@rhalbersma、いない重複し、他の質問はどのように知りたいです2つのスペシャライゼーションが同じ定義を使用しているかどうかを確認します。つまり、プライマリテンプレートを使用している場合と、同じパーシャルスペシャライゼーションを使用している場合、または両方とも同じ明示スペシャライゼーションを使用している場合です。私が知る限り、これはここでの質問ではありません。 –

+0

@Vincent、この特性は_any_クラステンプレートの使用を検出するために、または単に「MyClass」のために機能する必要がありますか?私は、一般的に、型と非型のパラメータを組み合わせて使用​​するクラステンプレートについては考えられません。 –

+0

@JonathanWakelyはコメントを削除しました。近い投票を取り消すことができないようです。 – TemplateRex

答えて

1

一般的に、タイプと非タイプのパラメータが混在した任意のクラステンプレートでは、これを行うことはできません。あなたは、パラメータのより具体的なセットのために近づくことができますが、私は一般的なケースを処理する方法を知らない

#include <type_traits> 

template <typename T, std::size_t N> 
class MyClass {}; 

// assume not the same 
template<typename T, typename U> 
struct my_trait : std::false_type 
{ }; 

// both specializations of MyClass 
template<typename T1, std::size_t N1, typename T2, std::size_t N2> 
struct my_trait<MyClass<T1, N1>, MyClass<T2, N2>> 
: std::true_type 
{ }; 

// both specializations of some class template Templ<typename, std::size_t> 
template<template<typename, std::size_t> class Templ, typename A1, std::size_t S1, typename A2, std::size_t S2> 
struct my_trait<Templ<A1, S1>, Templ<A2, S2>> 
: std::true_type 
{ }; 

// both specializations of some class template Templ<typename...> 
template<template<typename...> class Templ, typename... A1, typename... A2> 
struct my_trait<Templ<A1...>, Templ<A2...>> 
: std::true_type 
{ }; 
+0

'template class U> T get_scalar(U );に' decltype'を指定すると、スカラー/非スカラーパターンを既に知っていればスカラータイプを見つけることができます。私たちは "テンプレート'、スカラー、または 'typename's"ワイルドカードテンプレートの引数を取るつもりはありません。 – Yakk

関連する問題