2011-06-30 11 views
11

Załóżmy, że mam pewną klasę szablonów w zależności od typu T. T może być prawie wszystko: int, int*, pair <int, int> lub struct lol; nie może to być void, referencja ani nic innego, co kwalifikuje się do cv. Dla pewnej optymalizacji muszę wiedzieć, czy mogę podklasę T. Potrzebowałam więc pewnej cechy typu is_subclassable, określanej jako logiczna kombinacja podstawowych cech lub niektórych sztuczek SFINAE.Szablony C++: jak określić, czy dany typ nadaje się do podklasy

W pierwotnym przykład int i int* nie subclassable, a pair <int, int> i struct lol są.

EDIT: Jak litb wskazał poniżej, związki nie są również subclassable i T może być Union Typ również.

Jak napisać typ cechy, której potrzebuję?

+2

Hmm. Czy [is_class] (http://msdn.microsoft.com/en-us/library/bb982638.aspx) będzie wystarczający? Niepewny. –

Odpowiedz

13

Chcesz określić, czy jest to klasa niezrzeszona. Nie ma sposobu, bym to wiedział (a także nie znalazłem sposobu na zwiększenie). Jeśli możesz żyć z fałszywymi pozytywami związanymi ze związkami, możesz użyć numeru is_class.

template<typename> struct void_ { typedef void type; }; 

template<typename T, typename = void> 
struct is_class { static bool const value = false; }; 

template<typename T> 
struct is_class<T, typename void_<int T::*>::type> { 
    static bool const value = true; 
}; 

doładowania ma is_union który używa poleceń wbudowanych kompilatora specyficzne chociaż, który pomoże ci tutaj. is_class (które zwiększa również zapewnia) w połączeniu z is_union rozwiąże problem.

+0

Całkowicie zapomniałem o związku. Niestety nie, fałszywe alarmy są nie do przyjęcia. Mało, ponieważ to przecież optymalizacja. – doublep

+0

@Doublep, chyba że używasz C++ 0x, nie sądzę, że jest to rozwiązanie w przenośny sposób. –

+0

Tak, myślę, że będę musiał uczynić optymalizację zależną od obsługi C++ 0x lub po prostu ją upuść. – doublep

Powiązane problemy