簡體   English   中英

如何聲明以枚舉為鍵的std :: map和具有不同簽名的函數為值的聲明?

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

我想這對高級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);

我如何聲明將為我提供此功能的地圖? 我知道我可能無法直接將這些函數映射到那些鍵-我將需要某種抽象/間接方式來實現此目標,並且我相信使用可變參數函數/模板可以實現此目的,請參見可變參數參數包 ,但是我真的不清楚如何做到這一點。

同時,我使用函數指針類型實現了一種笨拙的解決方案,該函數指針類型將一個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 ,但它總會歸結為所有的功能使得一個共享署名。

由於所有功能都具有不同的簽名,因此不可能。

由於所有函數的類型不同,因此您甚至無法使用某種類型的擦除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM