8

type_traits 클래스를 작성하여 두 가지 유형이 동일한 템플릿 클래스의 특수화인지 여부를 감지하는 방법을 알고 싶습니다. 큰 문제는 다음과 같이 혼합 유형/비 유형 템플릿 클래스에서 작동해야한다는 것입니다.두 가지 유형이 같은 클래스 템플릿의 특수화인지 여부를 감지합니까?

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

그런 것을 디자인 할 수 있습니까?

+0

@rhalbersma 아닌 중복, 다른 문제는 방법을 알고 싶어 두 가지 전문화가 동일한 정의를 사용하는지 여부, 즉 기본 템플릿을 사용하거나 둘 다 동일한 부분 전문화를 사용하거나 둘 모두가 동일한 명시 적 전문화를 사용하는지 여부를 알려줍니다. 제가 말할 수있는 한 여기에 의문의 여지가 없습니다. –

+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

'gettype'을'template class U> T get_scalar (U );'에'decltype'하면 스칼라/비 스칼라 패턴을 이미 알고있는 경우 스칼라 타입을 찾을 수 있습니다. 우리는''템플릿'', 스칼라, 또는'typename's "와일드 카드 템플릿 인자를 가지고 있지 않습니다. – Yakk