2016-03-06 4 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); 
} 
Смежные вопросы