如何声明一个 std::map,其中枚举作为键,将具有不同签名的函数作为值

How to declare a std::map with enum as key and functions with varying signatures as values?

本文关键字:函数 声明 何声明 一个 map std 枚举      更新时间:2023-10-16

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

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

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

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);

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

同时,我使用函数指针类型实现了一个笨拙的解决方案,该函数指针类型将包含所有可能类型的一系列值的std::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);

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

这是你能得到的尽可能接近。您可以使用tupleany等库来掩盖它,但它始终归结为在所有函数之间进行共享签名。

由于所有函数都有不同的签名,因此不可能。

由于所有功能都有不同的类型,因此您甚至无法使用某种类型擦除。