我可以在C ++中将异构函数散列到undered_map吗

时间:2019-03-19 08:12:17

标签: c++ unordered-map

我有一堆异构函数,我想使用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"]);

}

但是即使将它们存储在(在void指针中)之后,在调用时我们也必须更改其类型,有什么办法可以使我做得更好。

1 个答案:

答案 0 :(得分:0)

  

但是即使将它们存储(在空指针中),在调用时我们仍然   更改其类型,有什么办法可以做得更好?

是的,对于异构函数类型,您可以例如使用std::variantstd::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