Esiste una tecnica/lo stile migliore per raggruppare le specializzazioni di modelli di classe per determinati tipi?Specializzazioni modello di classe di gruppo
Un esempio: Diciamo che ho un modello di classe Foo
e ho bisogno di avere si è specializzata la stessa cosa per la tipografia
A = { Line, Ray }
e in un altro modo per la tipografia B
B = { Linestring, Curve }
Quello che sto facendo finora: (la tecnica viene anche presentata here per le funzioni)
#include <iostream>
#include <type_traits>
using namespace std;
// 1st group
struct Line {};
struct Ray {};
// 2nd group
struct Curve {};
struct Linestring {};
template<typename T, typename Groupper=void>
struct Foo
{ enum { val = 0 }; };
// specialization for the 1st group
template<typename T>
struct Foo<T, typename enable_if<
is_same<T, Line>::value ||
is_same<T, Ray>::value
>::type>
{
enum { val = 1 };
};
// specialization for the 2nd group
template<typename T>
struct Foo<T, typename enable_if<
is_same<T, Curve>::value ||
is_same<T, Linestring>::value
>::type>
{
enum { val = 2 };
};
int main()
{
cout << Foo<Line>::val << endl;
cout << Foo<Curve>::val << endl;
return 0;
}
Una struttura di supporto aggiuntiva enable_for
accorcia il codice (e consente di scrivere direttamente i tipi accettati). Qualche altro suggerimento, correzioni? Non dovrebbe questo comportare meno sforzo?
È inoltre possibile creare un * tipo_trazioni * per gruppo. – Jarod42
@Angew: ahi, ho perso il modello base. Hai ragione, quelle sono due specializzazioni. –