Могу ли я хэшировать гетерогенную функцию в undered_map в c ++ - PullRequest
0 голосов
/ 19 марта 2019

У меня есть куча разнородных функций, я хочу использовать std :: unordered_map для вызова этой функции, чтобы нам не нужно было поддерживать длинный список вариантов переключения.

Это всего лишь пример.

#include <iostream>
#include <unordered_map>

using namespace std;

void hello()
{
  cout << "hello"<<endl;
}

int hello1()
{
   cout << "hello1"<<endl;
   return 1;
}

int hello2(int x)
{
    cout << "hello2" << endl;
    cout << x;    
    return x;
}


int main()
{
    unordered_map<string, void*> map;

    map["hello"] = (void*)hello;
    map["hello1"] = (void*)hello1;
    map["hello2"] = (void*)hello2;  

    if(map.find("hello2") != map.end())
    {
       func = map["hello2"].second;
    } 

    cout << reinterpret_cast<int(*)(int)>(map["hello2"])(2);
    cout <<endl;
    cout << reinterpret_cast<int(*)()>(map["hello1"]);

}

Но даже после их сохранения (в пустом указателе) во время вызова мы должны изменить его тип, есть ли способ сделать это лучше.

1 Ответ

0 голосов
/ 19 марта 2019

Но даже после их сохранения (в пустом указателе) во время вызова мы должны изменить его тип, есть ли способ, которым я могу сделать это лучше?

Да, длягетерогенные типы функций, например, вы можете использовать std::variant или std::any для хранения нескольких значений одного типа, типа объединения.

https://en.cppreference.com/w/cpp/utility/variant

https://en.cppreference.com/w/cpp/utility/any

В вашем примере это будет объявлено так:

std::variant<std::function<int()>, std::function<int(int)> >

В частности, с использованием std::variant приведение может полностью исчезнуть (но это может показаться переключением).

Вы также можете найти более удобным, гибким и безопасным использование std::function вместо необработанного указателя функции.

https://en.cppreference.com/w/cpp/utility/functional/function

...