我有一堆异构函数,我想使用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指针中)之后,在调用时我们也必须更改其类型,有什么办法可以使我做得更好。
答案 0 :(得分:0)
但是即使将它们存储(在空指针中),在调用时我们仍然 更改其类型,有什么办法可以做得更好?
是的,对于异构函数类型,您可以例如使用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