Czy istnieje technika/najlepszy styl do grupowania specjalizacji szablonów klas dla określonych typów?Specjalizacje w szablonach klas grupowych
Przykład: Powiedzmy, że mam klasy szablonu Foo
i muszę mieć to wyspecjalizowane takie same dla składania tekstu
A = { Line, Ray }
oraz w inny sposób dla typeset B
B = { Linestring, Curve }
Co robię do tej pory: (technika jest również przedstawiona jako here dla funkcji)
#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;
}
Dodatkowa struktura pomocnicza enable_for
skróciłaby kod (umożliwiając bezpośrednie zapisanie akceptowanych typów). Jakieś inne sugestie, poprawki? Czy nie powinno to wiązać się z mniejszym wysiłkiem?
Możesz także utworzyć * type_traits * według grupy. – Jarod42
@Angew: ouch, przegapiłem szablon podstawowy. Masz rację, to są dwie specjalizacje. –