考慮下面的代碼:C++函數switch語句或陣列抽象超過宏值
#define VAL_A 0
#define VAL_B 1
#define VAL_C 2
void TestSwitch01(uint32 val)
{
printf("%u: ", op);
switch (val)
{
case VAL_A: printf("aaa\n"); break;
case VAL_B: printf("bbb\n"); break;
case VAL_C: printf("ccc\n"); break;
default: printf("ddd\n");
}
}
#define VAL_A 10
#define VAL_B 11
#define VAL_C 12
void TestSwitch02(uint32 op)
{
printf("%u: ", op);
switch (val)
{
case VAL_A: printf("aaa\n"); break;
case VAL_B: printf("bbb\n"); break;
case VAL_C: printf("ccc\n"); break;
default: printf("ddd\n");
}
}
在本例中,我有三個VAL_*
宏和兩個TestSwitch*()
功能。但是,假設我有這種模式,但是具有5000個宏和20個TestSwitch*()
函數(換句話說--202個不同版本的VAL_A
-0,10等)。此外,我有#define
在單獨的文件中......因此foo001.h
具有(0 1 2)VAL
和foo002.h
具有(10 11 12)VAL
的s。
我不想複製粘貼20個版本的函數,因爲它是相同的函數。所以我真的想編寫一個抽象宏的函數。
很明顯,我可以使用變量,但我不想這樣做,因爲變量將在運行時設置,這將是緩慢的。我希望編寫C++代碼,使編譯器生成20個版本的TestSwitch*()
,每個版本對應於20個不同的5000個宏的其中一個。
我想避免寫一個宏的僞函數,因爲你不能進入,加上它很難閱讀(也語法突出顯示和智能感知不起作用)。
我考慮過使用模板函數,但使用5000個宏VAL_*
,它會非常瘋狂...... template void <uint32 VAL_A, uint32 VAL_B ... VAL_4999> TestSwitch(...)
。
我也嘗試着用函數指針數組替換switch()
語句來實現它(但是,在填充數組時,我仍然遇到了複製粘貼代碼問題。
我覺得C++有工具來做我想做的事,但我不知道如何......任何想法?
基本上我想要生成20個函數TestSwitchXX()
的副本 - 每個5000 VAL_*
的一套。
也許有一些技巧使用多個文件和#include
的和#if
的?
C++不是瑞士軍刀。它不能做任何事情。如果這真的是你想要的(並且我明白爲什麼你會想要它),並且switch語句的所有值都有一些邏輯模式,那麼使用正確的工具來完成正確的工作:編寫一個簡單的Perl腳本,或者使用您選擇的腳本語言來機器生成所有意大利麪代碼,並將其集成到您的構建系統中。如果這對'lex/flex'和'yacc/bison'來說足夠好,這裏就夠了。 –
使用連接運算符 – Raindrop7
查找表。設計一個包含密鑰和指向處理密鑰的函數的指針的結構。放置到地圖或矢量。搜索密鑰,然後如果找到密鑰,則通過取消引用函數指針來執行* associated *函數。 –