class template parameter list verwenden um overload member functions zu generieren



  • Frohes neues Jahr C++ .net Forum!

    Wie kann man aus einer class template parameter list Member Funktionen generieren?
    Ich erkläre die Frage vielleicht am besten mit pseudo code.

    template <typename.. args>
    struct Magic
    {
       // hier template Magie anwenden
    };
    
    // das man sich 
    using MagicIntStr = Magic<int, std::string> ;
    
    // so circa so vorstellen kann
    struct MagicIntStr
    {
      void foo(int) ;
      void foo(std::string) ;
    };
    

    ist so etwas überhaupt möglich?



  • Hallo!

    Zum Beispiel so:

    template <typename T>
    struct base {
       void foo(T);
    };
    
    template <typename ...Args>
    struct Magic : public base<Args>... { };
    


  • Jodocus schrieb:

    Hallo!

    Zum Beispiel so:

    template <typename T>
    struct base {
       void foo(T);
    };
    
    template <typename ...Args>
    struct Magic : public base<Args>... { };
    

    WOW, danke!

    das muss ich gleich probieren



  • funktioniert so leider nicht 😞

    http://ideone.com/a9eUGo

    #include <string>
    #include <iostream>
    
    template<typename T>
    struct Base
    {
      void foo(const T&) {
        std::cout << __PRETTY_FUNCTION__ << std::endl ;
      }
    
    };
    
    template <typename ...Args>
    struct Magic : public Base<Args>... { };
    
    int main (void)
    {
      Magic<int, std::string> magic ;
    
      int i = 1;
      magic.foo(i) ;
      std::string s="s" ;
      magic.foo(s) ;
    
      return 0 ;
    
    }
    
    prog.cpp: In function 'int main()':
    prog.cpp:22:9: error: request for member 'foo' is ambiguous
       magic.foo(i) ;
             ^
    prog.cpp:8:8: note: candidates are: void Base<T>::foo(const T&) [with T = std::basic_string<char>]
       void foo(const T&) {
            ^
    prog.cpp:8:8: note:                 void Base<T>::foo(const T&) [with T = int]
    prog.cpp:24:9: error: request for member 'foo' is ambiguous
       magic.foo(s) ;
             ^
    prog.cpp:8:8: note: candidates are: void Base<T>::foo(const T&) [with T = std::basic_string<char>]
       void foo(const T&) {
            ^
    prog.cpp:8:8: note:                 void Base<T>::foo(const T&) [with T = int]
    


  • so gehts!

    https://godbolt.org/g/PTDhmo

    (lösung jedoch nicht von mir, so clever bin ich nicht, mir wurde geholfen)


Anmelden zum Antworten