gpt4 book ai didi

C++ 函数 switch 语句或数组对宏值的抽象

转载 作者:行者123 更新时间:2023-11-30 03:38:26 25 4
gpt4 key购买 nike

考虑以下代码:

#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 VAL_*宏和 20 TestSwitch*()函数(换句话说 - VAL_A 的 20 个不同版本 - 0、10 等)。另外,我有 #define在单独的文件中... 所以 foo001.h有 (0 1 2) VAL的和foo002.h有 (10 11 12) VAL的。

我不想复制粘贴该函数的 20 个版本,因为它们是相同的函数。所以我真的很想写一个对宏进行抽象的函数。

显然我可以使用变量,但我不想那样做,因为变量会在运行时设置,这会很慢。我想编写 C++ 代码,让编译器生成 20 个版本的 TestSwitch*()每个对应于 20 组不同的 5000 组中的一组 VAL*宏。

我想避免编写一个宏伪函数,因为你不能进入它,而且它很难阅读(语法高亮和智能感知也不起作用)。

我考虑过使用模板函数,但使用 5000 VAL_*宏,这将是非常疯狂的... template void <uint32 VAL_A, uint32 VAL_B ... VAL_4999> TestSwitch(...) .

我也尝试通过替换 switch() 来做到这一点带有函数指针数组的语句(指向 printf() 的)...但是在填充数组时我仍然遇到复制粘贴代码问题。

我觉得 C++ 拥有完成我想做的事情的工具,但我不确定如何......有什么想法吗?

基本上我想生成 20 个函数拷贝 TestSwitchXX() - 每组 5000 个 VAL_*的。

也许使用多个文件和 #include 有一些技巧的和#if的?

最佳答案

一个适当的 C++ 解决方案是取消 #define 并在结构中使用枚举:

struct Foo {
enum { VAL_A = 0, VAL_B = 1, VAL_C = 2 };
};

struct Bar {
enum { VAL_A = 10, VAL_B = 11, VAL_C = 12 };
};

template<typename T>
void TestSwitch(int op)
{
std::cout << op << ": ";
switch (op) {
case T::VAL_A: std::cout << "aaa\n"; break;
case T::VAL_B: std::cout << "bbb\n"; break;
case T::VAL_C: std::cout << "ccc\n"; break;
default: break;
}
}

演示:http://ideone.com/u3kTtF

您也可以将 struct 替换为 enum class 但这样您就只能拥有值,struct 选项让您有机会包含其他描述事物的值关于 T 以后可能会有用。

枚举类演示:http://ideone.com/DBZuyn

关于C++ 函数 switch 语句或数组对宏值的抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39627942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com