如何使用枚举作为键来声明std :: map,并将具有不同签名的函数作为值来声明?

时间:2014-12-09 09:14:38

标签: c++ function c++11 enums stdmap

我认为对于高级C ++程序员来说这是一个非常简单的问题,但我不是一个,所以:

使用C ++ 11,实现std::map的优雅方法是使用范围enum作为键,并将具有不同签名的数学函数作为值:

简单示例 - 可以是任何数字类型或任意数量的函数args,但这些对我的用例来说是典型的:

enum class FUNCS
    {
         DOUBLE_FUNC1, DOUBLE_FUNC2, INT_FUNC3, INT_FUNC4
    };

一些功能:

double f1( int a, int b, double d);
double f2( int a, int b, int c, int d);
int f3( int a, double d, int c, double e);
int f4( int a, double d, int c);

我寻求的功能是std :: map,其工作原理如下:

初始化地图:

mMAP[FUNCS::DOUBLE_FUNC1]=f1;
mMAP[FUNCS::DOUBLE_FUNC2]=f2;
mMAP[FUNCS::INT_FUNC3]=f3;
mMAP[FUNCS::INT_FUNC4]=f4;

使用地图:

mMAP[FUNCS::DOUBLE_FUNC1](a,b,d);
mMAP[FUNCS::INT_FUNC3](a,d,c,e);

涉及某些类型转换的折衷方案可以使用具有不同参数的函数,这些函数都返回double

double f1( int a, int b, double d);
double f2( int a, int b, int c, int d);
double f3( int a, double d, int c, double e);
double f4( int a, double d, int c);

如何声明一张能够提供此功能的地图?我理解我可能无法将这些函数直接映射到这些键 - 我需要某种抽象/间接来实现这个目标,我相信使用可变参数函数/模板可以实现这一点,请参阅Variadic arguments和{ {3}},但我真的不清楚如何让它发挥作用。

与此同时,我使用函数指针类型实现了一个cludgy解决方案,该函数指针类型将包含所有可能类型的一系列值的std::tuple作为参数与结果的引用,然后在每个函数映射中,我使用元组的适当成员。的难看!

我的目标是将这些不同功能的数据发送到图表库,图表库使用boost::any类型的数据生成图表GUI驱动状态机将根据枚举通过地图调用相应的函数在状态机中表示的值,并根据该函数的数据生成图表。

2 个答案:

答案 0 :(得分:2)

C ++是一种静态类型语言。

唯一可以做到这一点的方法是让所有函数都使用公共签名,例如:

struct F1Data { double result; int a; int b; double d; };
struct F2Data { double result; int a, b, c, d; };
struct F3Data { int result; int a, b; double c; };
struct F4Data { int result; double a, b; int c; };

void f1(void* data);
void f2(void* data);
void f3(void* data);
void f4(void* data);

然后在每个函数中,您可以将data转换为正确的类型并从那里处理值。

这就像你能得到的那样接近。您可以使用tupleany等库来屏蔽它,但它总是可以归结为在所有函数中创建共享签名。

答案 1 :(得分:1)

由于所有功能都有不同的签名,因此无法实现。

由于所有功能都有不同的类型,你甚至不能使用某种类型的擦除。