我必须在C中编写代码,用户必须能够灵活地选择任何现有数据库,写入文件或实现自己的存储机制。我需要包装器函数,它们重定向到与在运行时或编译时选择的存储机制相对应的正确函数。假设我的存储选项是FLATFILE和SQLDB,我的包装函数是 insert(value)。因此,如果我选择FLATFILE作为我的存储,当我调用包装函数 insert(value)时,它应该依次调用写入文件的函数。如果我选择SQLDB, insert(value)应该调用在数据库中插入值的函数。
我知道我可以以某种方式使用函数指针的结构来做包装函数,但我不知道如何。
有没有人知道我可以参考的任何文档,链接,示例等,以理解和实现这样的东西?任何指针将不胜感激。谢谢!
谢谢!
答案 0 :(得分:1)
#define BACKEND_FLATFILE 0
#define BACKEND_SQLDB 1
void insert_flatfile(const t_value *v) {
...
}
void insert_sqldb(const t_value *v) {
...
}
void (*insert_functions[]) (const t_value *) = {
insert_flatfile,
insert_sqldb,
};
void insert_wrapper(t_value *v, int backend) {
insert_functions[backend](v);
}
此外,一个后端的不同函数应该填充到一个结构中,你应该创建一个这样的结构数组,而不是每个包装函数一个数组。
答案 1 :(得分:0)
您可以使用简单版本,例如:
struct backend {
int (*insert)(...);
int (*remove)(...);
...
};
static struct backend db_backend = { db_insert, db_remove, ... };
static struct backend other_backend = { other_insert, other_remove, ... };
const struct backend *get_backend(enum backend_type type)
{
switch (type)
{
case DB_BACKEND:
return &db_backend;
case DB_OTHER:
return &db_other;
...
}
}
以上所有内容都可以隐藏在C文件中,get_backend
并且枚举是公共的。然后你可以像这样使用它:
struct backend *b = get_backend(DB_BACKEND);
b->insert(...);
b->remove(...);
当然缺少许多细节(很多人喜欢使用typedef
)。这是一个基本设置,如果您不喜欢b->insert(...)
语法,或者您想要设置后端一次,然后使用insert()
和remove()
,您也可以创建包装函数代码。如果您已经有一些代码直接调用insert()
并且您希望将调用定向到右后端,这也很有用。
如果您想要更精细的解决方案,请查看http://www.cs.rit.edu/~ats/books/ooc.pdf。您不必从中实现每个细节,但它可以为您提供一些想法。