2016-07-29 13 views
0

コンパイル時に関数ポインタにリンクするラッパー関数を記述しようとしています。したがって、C++ 11で完全に正常に動作する次のコードを書きました:C++でのテンプレート引数としてのメンバー関数ポインタの宣言11

#include <iostream> 

template<typename Fn, Fn func, typename... Args> 
typename std::result_of<Fn(Args...)>::type callfunc(Args&&... args){ 
    //do something else here 
    return (*func)(args...); 
} 

double add(double a, double b){ 
    return a+b; 
} 

int main(){ 
    std::cout << callfunc<decltype(&add), &add>(2.0, 3.0) << "\n"; 
} 

私はこの

#include <iostream> 

template<typename Fn, Fn func, typename... Args> 
typename std::result_of<Fn(Args...)>::type callfunc(Args&&... args){ 
    //do something else here 
    return (*func)(args...); 
} 
class testclass { 
public: 
    double testadd(double a, double b); 
    void run(); 
}; 

double testclass::testadd(double a, double b){ 
    return a+b; 
} 

void testclass::run(){ 
    std::cout << 
    callfunc<decltype(&testclass::testadd), &testclass::testadd>(2.0, 3.0) 
    // ^^^^^ this won't compile! ^^^^ 
    << "\n"; 
} 

int main(){ 
    testclass obj; 
    obj.run() 
} 

のようなメンバ関数と同じことをしようとした場合しかし、私は、次のコンパイラエラーを取得:

error: indirection requires pointer operand ('double (testclass::*)(double,double)' invalid) return (*func)(args...); 

私は何が間違っていますか?

答えて

1

非静的メンバー関数を呼び出すには、有効なインスタンスポインタが必要です。以下は、動作するコードの修正版です:

#include <iostream> 

template<typename Fn, Fn func, typename Class, typename... Args> 
typename std::result_of<Fn(Args...)>::type callfunc(Class* instance, Args&&... args){ 
    return (instance->*func)(args...); 
} 
class testclass { 
public: 
    double testadd(double a, double b); 
    void run(); 
}; 

double testclass::testadd(double a, double b){ 
    return a + b; 
} 

void testclass::run(){ 
    std::cout << 
     callfunc<decltype(&testclass::testadd), &testclass::testadd>(this, 2.0, 3.0) 
     << "\n"; 
} 

int main(){ 
    testclass obj; 
    obj.run(); 
} 
関連する問題