静态模板化成员函数作为函数指针

Static templated member function as function pointer

本文关键字:函数 指针 成员 静态      更新时间:2023-10-16

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

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);

是否可以在不诉诸宏的情况下完成我想要实现的目标?

已解决,因为调用的是成员函数指针 - 它需要用括号括起来,将模板更改为以下内容并且它起作用了:

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