2016-03-06 130 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); 
}