我是一个为一台设备提供功能的工程库。该设备有一些共同的操作,但不同的算法来完成这些操作。我想要一个特定操作的函数原型,而不是一堆函数原型,而不是:
Alg1_Foo();
Alg2_Foo();
...
我要这个:
Foo(alg);
但是我不想将 alg 作为单独的参数传递,因为即使没有它,函数也会有很多参数,它们将具有用于识别和/或授权设备的参数,in 参数,out 参数(至少其中一个),所以我认为将 alg 添加为单独的参数会很烦人。
所以我的想法是提供这样的解决方案:
Foo(const SomeUnion& some_union);
在哪里:
union SomeUnion {
AlgId alg_id;
alg1::SomeStruct alg1_some_struct;
alg2::SomeStruct alg2_some_struct;
SomeUnion(alg1::SomeStruct some_struct) { alg1_some_struct = some_struct; };
SomeUnion(alg2::SomeStruct some_struct) { alg2_some_struct = some_struct; };
};
特定算法的结构将是这样的:
namespace alg1 {
struct SomeStruct {
static const AlgId alg_id = ALG1;
. . .
};
}
因此,如果要执行 alg1,我们将适当的结构传递给 Foo,它可以在 C++ 中运行,比如说
alg1::SomeStruct a;
Foo(a);
但我希望我的库保持纯 C 的可能性。当然我需要:
删除引用并用指针替换它们;
删除命名空间(我们仍然可以在结构的帮助下模拟它们(这个线程可能对感兴趣的人有帮助:C 中的命名空间);
将定义结构的 C++ 样式替换为 C 中的结构,并在标记命名空间中定义名称(typedef struct tagStruct {...} Struct;);
从内部结构和联合中删除函数。
但是,虽然我不明白是否有可能通过维护 C 来完成我想做的事情......你看到了吗?或者将 alg_id 作为单独的参数传递而不打扰联合和结构是否更简单(但如果可能的话,我想避免它)?