2016-03-06 133 views
0

我试图在整个代码中替换一系列静态的非静态成员函数对,我可以用宏来实现这一点,但我希望我可以用静态函数将非静态成员函数作为模板参数,然后将其作为函数指针存储。请看下面的代码:作为函数指针的静态模板成员函数

struct widget_param 
{ 
    void* ptr; 
}; 

struct widget_data 
{ 
    bool(*callback)(widget_param*); 
}; 

template <class CLASSNAME> 
class widget_base 
{ 
protected: 
    static CLASSNAME* get_instance(widget_param* param) 
    { 
     return static_cast<CLASSNAME*>(param->ptr); 
    } 

public: 
    template <bool(CLASSNAME::*f)(widget_param*)> 
    static bool static_to_nonstatic(widget_param* param) 
    { 
     return get_instance(param)->*f(param); 
    } 
}; 

class widget_derived : public widget_base<widget_derived> 
{ 
public: 
    // Attempting to replace this function 
    static bool static_do_stuff(widget_param* param) 
    { 
     return get_instance(param)->do_stuff(param); 
    } 
    bool do_stuff(widget_param* param) 
    { 
     param; 
     cout << "Success!"; 
     return true; 
    } 
}; 

int main() { 
    widget_derived derived; 
    //widget_data data{ widget_derived::static_do_stuff}; // Current approach 
    widget_data data{ widget_derived::static_to_nonstatic<widget_derived::do_stuff> }; 

    widget_param param{ &derived }; 
    data.callback(&param); 
    return 0; 
} 

我期待的模板,以评价:

static bool static_to_nonstatic(widget_param* param); 

是否有可能做什么,我试图实现,而不诉诸使用宏?

+0

这只是不能工作。你需要将这个指针存储在某个地方,在编译时你无法像这样解决它。如果你没有C++ ,可能你应该只在'struct widget_param'中存储这个指针 –

+0

它的工作原理,请参阅我的回答 – Stew

+0

我明白了,我误解了代码。或者太懒惰,无法完全阅读它,斯里。所以'param-> ptr'存储'this'指针。 –

回答

1

解决,因为调用的是一个成员函数指针 - 它需要用括号包围,改变了模板下面,它的工作:

template <bool(CLASSNAME::*f)(widget_param*)> 
static bool static_to_nonstatic(widget_param* param) 
{ 
    return (get_instance(param)->*f)(param); 
}