Template Parameter als Zeiger identifizieren



  • Ich wollte gern ein Template schreiben bei dem es möglich ist als Parameter sowohl normale Datentypen als auch Zeiger anzugeben. Da ich aber wissen muß ob es sich bei dem Parameter um einen Zeiger handelt würde ich gern wissen ob es dafür eine einfache Identifizierungsmöglichkeit gibt. Über typeid und den Namen komme ich ja nicht weiter da verschiedene Compiler die Namen unterschiedlich ausgeben.



  • Stichworte partielle Spezialisierung und Template Metafunctions:

    template <class T> 
    struct IsPointer
    {
      const static bool value = false;
    };
    
    template <class T>
    struct IsPointer<T*>
    {
      const static bool value = true;
    };
    
    template <class T>
    class MyClass
    {
      /* ... */
      const static bool tIsPointer = IsPointer<T>::value;
    
      /* ... */
    };
    

    Gibts auch in boost:
    http://www.boost.org/doc/libs/1_41_0/libs/type_traits/doc/html/boost_typetraits/reference/is_pointer.html



  • Danke das Funktioniert. Allerdings verstehe ich nicht genau wieso. Ist das eine spezielle Regel die dafür sorgt das für Datentypen hier T und für alle Zeiger T* vorgezogen wird?



  • Xebov@Logoff schrieb:

    Ist das eine spezielle Regel die dafür sorgt das für Datentypen hier T und für alle Zeiger T* vorgezogen wird?

    Ja. Die Regel besagt dass bei Templatespezialisierungen das "spezialisierteste", zum Typ passende genommen wird. Bei normalen Zeigern passt hier die partielle Spezialisierung besser als das normale Template.
    Google einfach mal nach partial template specialization.



  • Die Regel kannte ich. Ich wusste nur nicht das man bei Spezialiesierungen auch sowas wie T* angeben kann da das in Verbindung mit einem T=int* schon recht merkwürdig aussieht wenn man sich das denkt. Danke dir auf jedenfall werd damit mal ein bischen rumprobieren.



  • Wenn der verwendete Typ "int" ist, und die Spezialisierung "T*" genommen wird, dann ist T natürlich "int", und nicht "int*".
    Also T* = int* und T = int.

    Weil eben T* = int* besser passt, als T = int*.

    Sozusagen.



  • Das hab ich auch so verstanden. Ich meinte nur das es beim ersten anblick merkwürdig anmutet wenn man als Parameter int* übergibt und dann steht in der Spezialisierung T*.



  • Xebov@logoff schrieb:

    Ich wollte gern ein Template schreiben bei dem es möglich ist als Parameter sowohl normale Datentypen als auch Zeiger anzugeben.

    Nein, entweder handelt es sich bei einem Template-Parameter um einen Typ (typename, class) ...

    template< typename T >  // T ist ein Typ
    class ...
    

    ... oder um einen nicht-Typ (Zeiger, Funktion, Referenz, Ganzzahl) ...

    template< int * Z, int X >  // Z ist ein Zeiger auf int, X ist ein int
    int bar()
    {
      return *Z + X;
    }
    

    Das kannst Du allerdings nicht "mischen". Typ-Parameter bleibt Typ-Parameter und Nicht-Typ-Parameter bleibt Nicht-Typ-Parameter.

    Natürlich gibt es auch Zeigertypen und das ist wahrscheinlich auch das, was Du meintest.


Anmelden zum Antworten