Я пытаюсь заменить серию статических на нестационарные пары функций-членов во всем моем коде, я могу добиться этого с помощью макроса, но я надеялся, что смогу сделать это со статической функцией, которая принимает нестационарную функцию-член как аргумент шаблона, который затем сохраняется как указатель на функцию. Смотрите следующий код:Статическая шаблонная функция-член как указатель функции
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(¶m);
return 0;
}
Я ожидал шаблон для оценки в:
static bool static_to_nonstatic(widget_param* param);
Можно ли делать то, что я пытаюсь достичь, не прибегая к использованию макроса?
Это просто не может работать. Вам нужно сохранить этот указатель где-то, вы не можете решить его так, во время компиляции. Если у вас нет C++, возможно, вам стоит просто сохранить этот указатель в 'struct widget_param' –
Это работает, см. Мой ответ – Stew
Я вижу, я неправильно понял код. Или было слишком лениво, чтобы полностью прочитать его, сэр. Поэтому 'param-> ptr' хранит указатель' this'. –