8

Chciałbym wiedzieć, jak napisać klasę type_traits, aby wykryć, czy dwa typy są specjalizacjami tej samej klasy szablonów. Dużym problemem jest to, że powinien działać w przypadku typów szablonów mieszanych/nietypowych, takich jak:Wykryj, czy dwa typy to specjalizacja tego samego szablonu zajęć?

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

Czy można zaprojektować coś takiego?

+0

@rhalbersma, nie duplikat, druga kwestia chce wiedzieć, w jaki sposób powiedzieć, czy dwie specjalizacje używają tej samej definicji, tj. używają zarówno szablonu podstawowego, jak i obydwu używają tej samej specjalizacji częściowej lub obydwu używają tej samej specjalizacji jawnej. Tu nie chodzi o to, o ile wiem. –

+0

@Vincent, czy cecha musi zadziałać, aby wykryć zastosowania szablonu _any_ klasy lub po prostu dla 'MyClass'? Nie sądzę, aby generalnie szablony klas korzystały z kombinacji parametrów typu i typu. –

+0

@ JonathanWakely usunął komentarz, wydaje się, że nie jest w stanie wycofać głosowania bliskiego. – TemplateRex

Odpowiedz

1

Nie sądzę, że można to ogólnie zrobić dla dowolnego szablonu klasy z kombinacją parametrów typu i nietypowego.

można zbliżyć się do bardziej konkretnych zestawów parametrów, ale nie wiem dowolny sposób obsłużyć ogólnym przypadku:

#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

'decltype' na' szablon klasa U> T get_scalar (U ); 'pozwoli ci znaleźć typy skalarne, jeśli znasz już wzór skalarny/nonscalar. Nie mamy jednak argumentu typu "wziąłbym" szablonu, dowolnego skalarnego lub "typename". – Yakk

Powiązane problemy