8

Mi piacerebbe sapere come scrivere una classe type_traits per rilevare se due tipi sono specializzazioni della stessa classe template. Il grosso problema è che dovrebbe funzionare per misto tipi/non-tipi classe template come:Rileva se due tipi sono una specializzazione di uno stesso modello di classe?

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

E 'possibile progettare una cosa del genere?

+0

@rhalbersma, non un duplicato, l'altra domanda vuole sapere come indica se due specializzazioni utilizzano la stessa definizione, ovvero entrambe utilizzano il modello primario o entrambe utilizzano la stessa specializzazione parziale o entrambe utilizzano la stessa specializzazione esplicita. Questa non è la domanda qui, per quanto posso dire. –

+0

@Vincent, il tratto deve lavorare per rilevare gli usi del modello di classe _any_, o solo per 'MyClass'? Non penso sia possibile in generale modelli di classi che utilizzano un mix di parametri di tipo e non di tipo. –

+0

@JonathanAvendo rimosso il commento, non sembra in grado di ritirare il voto ravvicinato. – TemplateRex

risposta

1

Non penso che sia possibile farlo in generale per un modello di classe arbitrario con un mix di parametri di tipo e non di tipo.

È possibile avvicinarsi per gruppi più specifici di parametri, ma non so alcun modo per gestire il caso generale:

#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' on' template class U> T get_scalar (U ); 'consente di trovare i tipi scalari se si conosce già il modello scalare/non scalare. Tuttavia non abbiamo un argomento modello "I'll take' template's, any scalar, o 'typename's". – Yakk