我正在用 C 语言编写一个侵入式数据结构库。其中许多容器将共享功能。例如,将有许多容器提供正向和反向迭代。因此,我
我正在用 C 编写一个侵入式数据结构库。其中许多容器将共享功能。例如,将有许多容器提供正向和反向迭代。因此,我创建了一个标头,它将在所有容器中以宏的形式提供这些通用操作。这里只是正向迭代器。
#include "double_ended_priority_queue.h"
#include "ordered_map.h"
#include "realtime_ordered_map.h"
#define BEGIN(container_ptr) \
_Generic((container_ptr), \
double_ended_priority_queue *: depq_begin, \
ordered_map *: om_begin, \
realtime_ordered_map *: rom_begin)(container_ptr)
#define NEXT(container_ptr, iter_elem_ptr) \
_Generic((container_ptr), \
double_ended_priority_queue *: depq_next, \
ordered_map *: om_next, \
realtime_ordered_map *: rom_next)((container_ptr), \
(iter_elem_ptr))
用法如下。
struct val
{
int id;
int val;
ccc_depq_elem elem;
};
void
inorder_fill(int vals[], size_t size, double_ended_priority_queue *pq)
{
if (depq_size(pq) != size)
{
return;
}
size_t i = 0;
for (struct val *e = BEGIN(pq); e && i < size; e = NEXT(pq, &e->elem))
{
vals[i++] = e->val;
}
}
这看起来不错,而且这种功能可以扩展到许多其他操作(emplace、Rust 的 Entry API、范围等)。但是,我必须在 _Generic
文件顶部的列表中包含所有容器的标头。否则,当用户包含文件时, generics.h
未包含的 _Generic
类型案例的类型都是未知的
随着更多容器共享这些功能,文件 generics.h
中包含的内容数量 _Generic
使用这种方法没有运行时开销,但我似乎用这种方法造成了巨大的编译时间膨胀。
我是否误解了一个很好的用例 _Generic
?
C 中还有其他泛型方法吗?还是我试图解决不存在的问题,并且每个容器自己提供此功能就可以了?
这个标题是 C 语言中 `_Generic` 的一个很好的用例吗?
下载声明:
本站所有软件和资料均为软件作者提供或网友推荐发布而来,仅供学习和研究使用,不得用于任何商业用途。如本站不慎侵犯你的版权请联系我,我将及时处理,并撤下相关内容!
帖子版权声明
1、本帖标题:这个标题是 C 语言中 `_Generic` 的一个很好的用例吗? 本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com
除非注明,本帖由Harshil Patanvadiya 在本站《c》 版块原创发布,
转载请注明出处!