【发布时间】:2013-03-01 23:23:54
【问题描述】:
我正在为一个设备提供功能的工程库。该设备有一些共同的操作,但不同的算法来完成这些操作。我想要一个特定操作的函数原型,而不是一堆函数原型,而不是:
Alg1_Foo();
Alg2_Foo();
...
我想要这个:
Foo(alg);
但我不想将 alg 作为单独的参数传递,因为即使没有它,函数也会有很多参数,它们会有用于识别和/或授权设备的参数,输入参数,输出参数(至少其中之一),所以我认为将 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 的可能性。当然我需要:
删除引用并用指针替换它们;
删除命名空间(我们仍然可以在结构的帮助下模拟它们(此线程可能对感兴趣的人有所帮助:Namespaces in C);
将定义结构的 C++ 样式替换为 C 中的结构,并在标签命名空间中定义名称 (typedef struct tagStruct {...} Struct;);
从内部结构和联合中删除函数。
但是,虽然我不明白是否有可能通过维护 C 来完成我想做的事情......你看到了吗?或者将 alg_id 作为一个单独的参数传递而不打扰联合和结构是否更简单(但如果可能的话,我想避免它)?
【问题讨论】:
-
那么你为什么不希望每个算法都有单独的函数呢?
-
问题是什么?你想解决什么问题?
-
我想到了过度设计。
-
也许它是过度设计的,但我们有一个库,它是由在我之前在公司工作的人设计的,我们为每个单独的算法都有很多原型。我不会说维护它们很容易,比如说,如果特定操作的逻辑发生变化,我们需要更改与之相关的所有原型。这只是上面写的一个建议,如果不可能在 C 中完成,我会接受它并留下单独的函数或添加 alg_id 作为参数。但如果你有一些线索,他们将不胜感激。
-
使用 C++,您可以重载
Foo为每个算法采用不同的结构。所以你实际上是在定义一堆函数(你说你不想这样做,但没有给出任何理由),它们都具有相同的名称。
标签: c++ c arguments compatibility unions