2009-09-11 12 views
6

Als Follow-up zu this question: Ich muss in einer Klasse Funktion wie folgt entscheiden:Template-Funktion T: Wie kann man herausfinden, ob T ein Zeiger ist?

template< typename T > bool Class::Fun <T*> (T& variable) {...} 

ob T ein Zeiger oder nicht.

In der oben genannten Frage war die Antwort, partielle Template-Spezialisierung zu verwenden. Soweit ich herausgefunden habe, ist das für Klassenfunktionen nicht möglich. Ist das wahr? Wenn ja, gibt es eine andere Möglichkeit herauszufinden, ob T ein Zeiger ist?

+1

@iammilind: Sie werden bemerken, dass die Frage bereits mit der Frage verknüpft, damit Sie es markiert haben ein Duplikat und dass es wurde auch schon dort festgestellt, in welcher Hinsicht es anders ist. Bitte entfernen Sie das "als doppelt markiert". – fuenfundachtzig

Antwort

22

Keine Notwendigkeit, Mitgliedsfunktion zu spezialisieren. In dieser Antwort verwendete eigenständige Struktur. Sie können es immer noch in den Memberfunktionen der Klasse verwenden.

// stand-alone helper struct 
template<typename T> 
struct is_pointer { static const bool value = false; };  
template<typename T> 
struct is_pointer<T*> { static const bool value = true; }; 

// your class 
class Class{ 
public: 
template<typename T> 
void Fun(T& variable) { 
    std::cout << "is it a pointer? " << is_pointer<T>::value << std::endl; 
} 
}; 

Auf der anderen Seite, könnten Sie Überlastung Funktion:

class Class { 
public: 
template<typename T> 
void Fun(T& variable) { 
    std::cout << "is it not a pointer! " << std::endl; 
} 
template<typename T> 
void Fun(T*& variable) { 
    std::cout << "is it a pointer! " << std::endl; 
} 
}; 
+2

Sie haben zwei sehr gute Möglichkeiten gezeigt, dies zu erreichen. Leider habe ich nur eine Stimme für dich. ':)' – sbi

+0

Vielen Dank für das Lob, aber ich würde sagen, ich habe übliche/standard Wege gezeigt, um das zu erreichen. –

+2

Das heißt nicht, dass sie nicht sehr gut sein können. ':)' – sbi

Verwandte Themen