Funktion als Templatevariable



  • Hallo, kann ich eine Funktion als Template-Variable mitgeben? Meine Idee wäre so, aber das scheint mi kein valides C++ zu sein:

    #include <iostream>
    #include <string>
    
    class Test {
        private:
            std::string test;
    
        public:
            Test( const std::string& test )
                : test( test ) {
            }
    
            std::string getString() {
                return test;
            }
    };
    
    template<typename A>
    std::string queryString( const Test& x ) {
        return A( x );
    }
    
    int main( int argc, char *argv[]) {
        Test a( "hallo" ), b( "welt" );
    
        std::cout << queryString<Test::getString>( a )
            << " "
            << queryString<Test::getString>( b )
            << std::endl;
    
        return 0;
    }
    


  • AH, ich glaub ich habs...

    ...
    
    typedef std::string (Test::*TestFunction)();
    
    template<TestFunction A>
    std::string queryString( Test& x ) {
        return (x.*A)();
    }
    
    int main( int argc, char *argv[]) {
        Test a( "hallo" ), b( "welt" );
    
        std::cout << queryString<&Test::getString>( a )
            << " "
            << queryString<&Test::getString>( b )
            << std::endl;
    
        return 0;
    }
    

    Kann mir jemand sagen ob das so korrekt ist, oder ob das nur zufällig funktioniert?



  • oliver-abc schrieb:

    AH, ich glaub ich habs...

    ...
    
    typedef std::string (Test::*TestFunction)();
    
    template<TestFunction A>
    std::string queryString( Test& x ) {
        return (x.*A)();
    }
    
    int main( int argc, char *argv[]) {
        Test a( "hallo" ), b( "welt" );
        
        std::cout << queryString<&Test::getString>( a )
            << " "
            << queryString<&Test::getString>( b )
            << std::endl;
        
        return 0;
    }
    

    Kann mir jemand sagen ob das so korrekt ist, oder ob das nur zufällig funktioniert?

    Es sieht auf den ersten Blick korrekt aus


Anmelden zum Antworten