这不应该太难,但我被卡住了。
我正在尝试为变量分配函数,但我需要知道数据类型,以便将其分配给地图。
我成功地做到了这一点:
auto pfunc = Ext::SomeFunction
这将允许我这样做:
pfunc(arg, arg2);
但我需要知道" auto"所涵盖的数据类型。所以我可以将我的函数映射到一个字符串。
例如:
std::unordered_map<std::string, "datatype"> StringToFunc = {{"Duplicate", Ext::Duplicate}};
这些函数中的大多数都返回void,但还有其他函数返回double和int。
如果有更好的方法,请告诉我,但我真的想知道上面使用的汽车背后的数据类型。
非常感谢您提供的任何帮助。
答案 0 :(得分:0)
给定class foo
和成员函数fun
,您可以按以下方式创建成员函数指针:
struct foo
{
void fun(int, float);
};
void(foo::*fptr)(int, float) = &foo::fun;
因此fptr
的类型为void(foo::*)(int, float)
。通常使用这样的东西,您可能需要引入typedef
或类型别名以使声明更具可读性:
using function = void(foo::*)(int, float);
// or typedef void(foo::*function)(int, float);
function fptr = &foo::fun;
另外,以上适用于成员函数指针。对于自由函数,语法为:
void fun(int, float);
void(*fptr)(int, float) = &fun;
您可以相应地定义类型别名。
答案 1 :(得分:0)
您需要对函数对象进行类型擦除,std::function
为您实现。
#include<functional>
#include<unordered_map>
... define f1
... define f2
int main(){
std::unordered_map<std::string, std::function<ret_type(arg1_type, arg2_type)>> um = {{"name1", f1}, {"name2", f2}};
}
答案 2 :(得分:0)
我通过使用下面的typedef和unordered_map解决了这个问题:
typedef void(*StringFunc)(std::basic_string<char, std::char_traits<char>, std::allocator<char> >);
std::unordered_map<std::string, StringFunc> StringToAction = {
{"Buy", Car::BuyCar}, {"Fix", Car::FixCar}
};