Получить имя перегруженной функции, переданной в качестве аргумента во время выполнения - PullRequest
3 голосов
/ 26 мая 2019

Предположим, что все включения определены, просмотрите структуру кода, определенную ниже.

std::unordered_map<std::string, void*> callbackReg;

class A
{
public:
    void foo(int a)
    {
        //impl
    }
    void foo(int a, int b)
    {
        //impl
    }
    void foo(int a, double d)
    {
        //impl
    }

};


template<class Instance , typename Function>
void register_func(Instance& obj, Function func)
{
    /* have to store function name as the key and 
     - pointer to raw member function pointer as the value, 
     - in callbackReg Map */
    // ---> Point B
}

int main(int argc, const char * argv[])
{
    A a;
    register_evt(a, &A::foo); //---> point A
    system("Pause");
}

Проблемы и обсуждения

  1. @ Point A как решить проблему с разрешением области имен функций, что означает, как вызвать перегруженную функцию / указатель на такую ​​функцию? без встроенного статического приведения, потому что это делает немного уродливым и грязным.
  2. @ Point B предположим, что мы исправили проблему с переопределением имени перегрузки, и теперь мы должны сохранить имя функции элемента и его значение указателя в callbackReg карта.

Я знаю, может ли это быть плохим громоздким подходом, но возможно ли это в C ++? или же есть какой-либо способ сохранить raw memeber funtion pointers с каким-либо другим значением ключа, чтобы использовать их как callbacks. Поскольку во время debug, отладчик уже знает, какое имя функции передается как register_func аргумент функции шаблона. Пожалуйста, посмотрите на изображение. enter image description here

  • Поэтому просто, как мы можем реализовать сценарий callback register / unregister, используя только необработанные указатели на функции-члены / не-члены?

(Пожалуйста, если решение или методология кроссплатформенный подход, который был бы благодарен, по крайней мере, на основе Win32)

1 Ответ

2 голосов
/ 26 мая 2019

Вы можете использовать Boost Backtrace :

boost :: stacktrace :: frame предоставляет информацию о функциях. Вы можете создать этот класс из указателя на функцию и получить имя функции во время выполнения

...