belli türleri için grup sınıf şablonu uzmanlık bir tekniktir/iyi tarzı var mı uzmanlıklara?Grup sınıf şablonu
Bir örnek: Bir sınıf şablonu Foo
kullandığınızı varsayalım ve bunu harf ile
A = { Line, Ray }
için ve dizgi B
B = { Linestring, Curve }
için başka bir şekilde aynı uzmanlaşmış olması gerekir
şimdiye kadar ne yapıyorum:
(tekniği de fonksiyonlar için here sunulmuştur)#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;
}
Ekstra bir yardımcı yapı enable_for
kodu kısaltır (ve kabul edilen türleri doğrudan yazmayı sağlar). Başka önerileriniz var mı, düzeltmeler? Bu daha az çaba gerektirmiyor mu?
Ayrıca grup tarafından * a * type_traits oluşturabilir. – Jarod42
@Angew: ah, ben baz şablonu kaçırdı. Haklısın, bunlar iki uzmanlık. –