Vorrei verificare se due tipi sono uguali, ma indipendentemente dai parametri del modello. Qualcosa di simile a questo:Come verificare se due tipi provengono dalla stessa classe di modelli
template<class T>
class A {};
class B {};
int main() {
cout << std::is_same_template<A<int>, A<string>>::value << endl; // true
cout << std::is_same_template<A<int>, B>::value << endl; // false
}
Sono consapevole std::is_same
per verificare se due tipi di corrispondenza exacty.
Un motivo per cui ho bisogno di questo: Ho un metodo basato su modelli che può essere chiamato con qualsiasi tipo, ma vorrebbe impedire cioè viene chiamato con il tipo A
(che è template), eventualmente utilizzando un static_assert
. Sono stati A
non su modelli, credo che potrebbe essere fatto facilmente usando std::is_same
, ma ora, ho un problema ...
EDIT: posso escludere manualmente una per pochi comuni Ts, utilizzando, Cerco un modo di farlo per tutti i T:
static_assert(!std::is_same<parameter_type, A<int>>::value, "Cannot use this function with type A<T>");
static_assert(!std::is_same<parameter_type, A<double>>::value, "Cannot use this function with type A<T>");
static_assert(!std::is_same<parameter_type, A<bool>>::value, "Cannot use this function with type A<T>");
Due tipi non sono gli stessi, se i loro parametri template sono diversi. Pertanto, 'A' e 'A ' sono lontani dallo stesso tipo. –
skypjack
Bene, ne sono a conoscenza, ecco perché non posso usare 'std :: is_same'. Quello che sto chiedendo è, se c'è un modo per confrontare meno rigorosamente, rendere A confronta uguale e A e B no? –
jureslak
È possibile utilizzare l'approccio inverso mediante la specializzazione del modello, quindi accettare solo le classi consentite e definire altrimenti una funzione vuota/rotta/di lancio/qualsiasi. – skypjack