Unterschiedliche Funktionsaufrufe je typedef



  • Hallo zusammen,

    ich würde gerne wissen, ob es möglich ist, je nach typedef eine andere
    Funktion aufrufen zu lassen. Zur Verdeutlichung ein kurzes Code-Fragment:

    #include <iostream>
    
    typedef unsigned int my_int;
    
    void doItNow(unsigned int i){
    	std::cout << "unsigned int" << std::endl;
    }
    
    void doItNow(my_int i){
    	std::cout << "my_int" << std::endl;
    }
    
    template <typename T> void doIt(T t) {
    	doItNow(t);
    }
    
    int main() {
    	unsigned int i = 0;
    	doIt(i);
    	my_int i2 = 0;
    	doIt(i2);
    	return 0;
    }
    

    Leider kompiliert er nicht:

    ../src/Test.cpp: In function 'void doItNow(my_int)':
    ../src/Test.cpp:18: error: redefinition of 'void doItNow(my_int)'
    ../src/Test.cpp:14: error: 'void doItNow(unsigned int)' previously defined here
    

    Eine Alternative zu dem geposteten Code, die mir bekannt ist, wäre:

    #include <iostream>
    
    typedef unsigned int my_int;
    
    void doItNow1(unsigned int i){
    	std::cout << "unsigned int" << std::endl;
    }
    
    void doItNow2(my_int i){
    	std::cout << "my_int" << std::endl;
    }
    
    template <typename T> void doIt(T t, void (*f)(T)) {
    	f(t);
    }
    
    int main() {
    	unsigned int i = 0;
    	doIt(i, &doItNow1);
    	my_int i2 = 0;
    	doIt(i2, &doItNow2);
    	return 0;
    }
    

    Geht sowas denn auch ohne den Funktionszeiger?

    Gruß,
    CSpille



  • nein. nach der typegedefte typ kann vom originaltyp nicht unterschieden werden. typedef macht sozusagen nur ein schreibvereinfachungsmakro für den programmierer.



  • Danke für die kurze präzise Antwort!!!



  • Geht sowas denn auch ohne den Funktionszeiger?

    Klar. Da gibt es sehr viele Möglichkeiten. Du könntest z.B eine Fallunterscheidung innerhalb der Funktion machen und dann einfach z.B einen Integer übergeben, anstatt des Funktionszeigers.
    Du könntest aber auch einen Wrapper für einen der Typen schreiben, dann kannst du das wieder zur Kompilierzeit machen.
    Oder du benutzt dennoch ein template, aber anstatt den Typen implizit zu übernehmen, gibst du da einen Integer für das template an, damit er weiss, welche spezialisierte Funktion er nehmen soll.

    template <int which>
    void doIt ( int i )
    {
     //...
    }
    
    template <>
    void doIt<0> ( int i )
    {
     //...
    }
    
    template <>
    void doIt<1> ( int i )
    {
     //...
    }
    
    int main ()
    {
        unsigned int i = 0;
        doIt<0>(i);
        my_int i2 = 0;
        doIt<1>(i2);
    }
    

Anmelden zum Antworten