2016-07-29 143 views
0

我想寫一個包裝函數,它在編譯時鏈接到一個函數指針,因此我寫了下面的代碼,它在C++ 11中工作得很好:decltype成員函數指針作爲模板參數在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(); 
} 
相關問題