2016-07-29 145 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(); 
} 
相关问题