Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何声明一个以enum为键、以不同签名为值的std::map? 我想对于高级C++程序员来说这是一个非常简单的问题,但我不是一个,所以: < P>使用C++ 11,实现 STD的优雅方法是:MAP使用范围为 EnUM 作为密钥,并将具有不同签名的数学函数作为值:_C++_Function_C++11_Enums_Stdmap - Fatal编程技术网

如何声明一个以enum为键、以不同签名为值的std::map? 我想对于高级C++程序员来说这是一个非常简单的问题,但我不是一个,所以: < P>使用C++ 11,实现 STD的优雅方法是:MAP使用范围为 EnUM 作为密钥,并将具有不同签名的数学函数作为值:

如何声明一个以enum为键、以不同签名为值的std::map? 我想对于高级C++程序员来说这是一个非常简单的问题,但我不是一个,所以: < P>使用C++ 11,实现 STD的优雅方法是:MAP使用范围为 EnUM 作为密钥,并将具有不同签名的数学函数作为值:,c++,function,c++11,enums,stdmap,C++,Function,C++11,Enums,Stdmap,简单示例-可以是任意数字类型或任意数量的函数参数,但这些是我的用例的典型示例: 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

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

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);
使用地图:

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);
涉及某些类型转换的折衷方案可以使用具有不同参数的函数,这些函数都返回双精度的

我如何才能声明一个将为我提供此功能的映射?我知道我可能无法将这些函数直接映射到这些键-我需要某种抽象/间接方法来实现这一目标,我相信使用可变函数/模板可以实现这一点,请参见和,但我真的不清楚如何使这一点起作用

同时,我使用函数指针类型实现了一个笨拙的解决方案,该类型将包含一系列所有可能类型的值的
std::tuple
作为参数,并对结果进行引用,然后在映射的每个函数中,我使用tuple的适当成员<强壮>丑陋


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

因为所有函数都有不同的签名,所以这是不可能的


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

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);
然后在每个函数中,您可以将
数据
转换为正确的类型,并从中处理值


那是你能得到的最接近的了。您可以使用
tuple
any
之类的库来屏蔽它,但它总是可以归结为在所有函数之间创建一个共享签名。

每个
FUNCS
值是否对应于一个唯一的函数类型?@T.C.-否。如果它们对应于一个函数类型,那就没有问题了!请阅读:)换句话说,您还希望能够编写
mMAP[FUNCS::DOUBLE_FUNC1]=f2?@T.C.-基本上是的,尽管这不是重点。关键是要有一个统一、简洁、对称的接口来映射这些不同的函数,而不需要各种条件逻辑。请仔细阅读这个问题,我相信它很清楚。如果我错了,请纠正我。抱歉。程序员或编译器如何知道使用哪个参数签名?只能通过折衷将所有参数类型折叠为一个混合类型来完成。C++是静态类型的语言,我不相信这是不可能的。请参阅edit:and@Vector重新设计比尝试使用可变参数更好。事实上,如前所述,您可以使用类型擦除,但随后需要将返回值放入结构中。@Bццћ-从未真正使用过可变参数,而且它们看起来并不漂亮;铸造
void*
在我看来并不是一个好的设计选项,尽管它比笨拙的
元组方法更容易管理,而元组方法非常难看。我开始觉得我应该忘记地图,使用开关。是的,使用开关。如果你能避免这场战斗,那么就这么做。使用and/or怎么样?变量参数可以做到,但远没有我的建议干净。参数包会影响函数的类型,也会更难使用。我可能只是想使用一个开关,但所有的事情都认为这可能是实现我所寻找的最简单、最干净的方法,所以我接受这个答案。谢谢!我同意,随开关走。这更自然。