umwandeln in template?



  • he,
    ich habe folgende typedef's

    #if defined(A)
    
    namespace FM
    {
        typedef float scalar;
    }
    
    #elif defined(B)
    
    namespace FM
    {
        typedef double scalar;
    }
    #endif
    

    würde das aber gern als template gestallten, so dass ich beide typen verwenden kann. beide datentypen sollten hinterher als scalar bezeichnet werden. kann ich das irgendwie umsetzen?
    liebe grüße micha



  • Namespaces können nicht als Template angelegt werden, Klassen schon:

    template<typename T>
    struct FM
    {
      typedef T scalar;
    };
    
    FM<float>::scalar value;
    

    (btw, auf globaler Ebene kannst du nur einen Typ mit dem Namen 'scalar' haben - wenn du beide parallel benötigst, mußt du sie in verschiedene Scopes verpacken.



  • So?

    template< typename T, typename U, bool flag = true >
    struct SelectType
    {
        typedef T Type;
    };
    
    template< typename T, typename U >
    struct SelectType< T, U, false >
    {
        typedef U Type;
    };
    
    typedef SelectType< char, long >::Type Type; // Type = char
    typedef SelectType< char, long, false >::Type Type; // Type == long
    


  • mh,
    so kann ich's nicht machen.
    wenn ich ne klasse draus mache, gibts da ne möglichkeit ein

    template<class T> class scalar{}
    

    nur als scalar aufzurufen und das automatisch als
    scalar<double> zu interpretieren?



  • Nein, bei Template-Klassen mußt du immer die Template-Parameter angeben. Du könntest höchstens Default-Parameter verwenden:

    template<typename T = double>
    class scalar
    {
      ...
    }
    
    scalar<> value;//ist ein scalar<double>
    

    (die Template-Klammern sind aber (afair) notwendig, selbst wenn nichts drin steht)



  • vielen dank,
    jetzt kann ich wenigstens aufhören mit suchen und anfangen mit implementieren
    😕



  • Den typedef würde ich garnicht durch irgendetwas ersetzen, sondern einfach entfernen. Dann machst du aus allen Klassen die "scalar" verwenden ein Template:

    class Foo
    {
    public:
        scalar Bar();
        scalar m_blubb;
    };
    // -->
    template <class S> class Foo
    {
    public:
        S Bar();
        S m_blubb;
    };
    

    Das ist zumindest die "übliche" Vorgehensweise.



  • hustbaer schrieb:

    Das ist zumindest die "übliche" Vorgehensweise.

    nein. erzeugt viel zuviele komplikationen. je nachdem wie oft scalar gebraucht wird.

    das #ifdef mit den typedefs ist die normale lösung für sowas. man muss nicht zwangsläufig immer templates verwenden. wenn scalar zur compiletime zu entweder float oder double wird dann ist so ein #ifdef super.

    das problem mit template params ist: ich hab die überall im code stehen. das typedef steht einmal an einer zentralen stellen. wenn ich nun long double statt double will: *peng* neues #ifdef rein und fertig. alles kompiliert problemlos.



  • Ja, wenn man nur einen Datentyp konstant im gesamten Programm verwenden will, ist ein typedef völlig ausreichend (ich verwende dazu nichtmal #ifdef-Konstrukte, sondern würde je nach Bedarf mein typedef xxx scalar; berichtigen). Aber der OP wollte ja float- und double-Versionen nebeneinander verwenden und dazu reicht ein typedef nicht aus.


Anmelden zum Antworten