Существует ли метод/лучший стиль для группировки специализированных шаблонов классов для определенных типов?
Пример: Допустим, у меня есть шаблон класса Foo
, и мне нужно, чтобы он специализировался на наборе
A = { Line, Ray }
и другим способом для набора B
B = { Linestring, Curve }
Что я делаю до сих пор: (техника также представлена здесь для функций)
#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;
}
Дополнительная вспомогательная структура enable_for
сократит код (и позволит напрямую писать принятые типы). Любые другие предложения, исправления? Разве это не требует меньших усилий?