2015-08-02 9 views
7

Nachdem ich gesehen habe, dass eine Vorlage teilweise auf Referenz- oder Zeigertypen spezialisiert sein kann, habe ich mich gefragt, ob ich eine Vorlage schreiben kann, die nur einen Zeigertyp akzeptiert. Dies ist mein Versuch:Eine Vorlage, die nur Argumente vom Zeigertyp akzeptiert

template <typename T*> 
struct MyTemplate{}; 

int main() { 
    MyTemplate<int *> c; 
    (void)c; 
    return 0; 
} 

Dies kompiliert nicht. Wie sollte es geändert werden? (Dh wenn das, was ich versuche, überhaupt möglich zu tun ist)

+0

Check [ 'std :: is_pointer'] (http://en.cppreference.com/w/cpp/types). –

Antwort

12

Sie können teilweise Spezialisierung verwenden:

template <typename T> struct MyTemplate; // Declaration 

template <typename T> struct MyTemplate<T*> // Specialization 
{ 
}; 

oder verwenden static_assert

template <typename T> struct MyTemplate 
{ 
    static_assert(std::is_pointer<T>::value, "Expected a pointer"); 

    // T = value_type* 
    using value_type = std::remove_pointer_t<T>; 
};