需要在C ++中为变量赋值

时间:2017-05-31 15:37:46

标签: c++ function variables unordered-map auto

这不应该太难,但我被卡住了。

我正在尝试为变量分配函数,但我需要知道数据类型,以便将其分配给地图。

我成功地做到了这一点:

auto pfunc = Ext::SomeFunction

这将允许我这样做:

pfunc(arg, arg2);

但我需要知道" auto"所涵盖的数据类型。所以我可以将我的函数映射到一个字符串。

例如:

std::unordered_map<std::string, "datatype"> StringToFunc = {{"Duplicate", Ext::Duplicate}};

这些函数中的大多数都返回void,但还有其他函数返回double和int。

如果有更好的方法,请告诉我,但我真的想知道上面使用的汽车背后的数据类型。

非常感谢您提供的任何帮助。

3 个答案:

答案 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}
};