我怎么能做那样的事情(只是一个例子):
any_struct *my_struct = create_struct(); add_struct_member(my_struct, "a", int_member); add_struct_member(my_struct, "b", float_member);
这样我可以在addressOfMyStruct
这里使用给定的结构加载和使用"从外部"(在地址)的结构实例?
any_struct_instance *instance = instance(my_struct, addressOfMyStruct); int a = instance_get_member(instance, "a"); float b = instance_get_member(instance, "b");
我也希望能够以这种方式动态创建结构实例.
我希望我很清楚我想做什么.我知道C/Invoke能够做到这一点,但有没有一个单独的库可以做到这一点?
实际上,演示用C语言进行这项工作的代码对于SO帖子来说有点过分了.但解释基本概念是可行的.
你在这里真正创造的是一个模板化的财产袋系统.为了保持这种状态,你需要做的一件事就是像哈希表这样的一些相关结构.我会说使用std :: map,但你提到这是一个只有C的解决方案.为了便于讨论,我只是假设你有一些哈希表.
"create_struct"调用将需要返回一个结构,该结构包含一个指向散列表的指针,该散列表const char*
实际上是一个size_t.此映射定义了为创建结构的新实例所需的内容.
"insance"方法实际上将创建一个具有相同数量成员的新哈希表作为模板哈希表.让懒惰的evualation抛出窗口一秒钟,并假设你预先创建所有成员.该方法需要遍历模板散列表,为每个条目添加一个成员,并对指定大小的内存块进行malloc.
instance_get_member的实现只是按名称在地图中进行查找.虽然签名和使用模式需要改变.C不支持模板,必须选择可以表示所有数据的公共返回类型.在这种情况下,您需要选择,void*
因为这是内存需要存储的方式.
void* instance_get_member(any_struct_instance* inst, const char* name);
您可以通过添加envil宏来模拟模板,从而使这更好一些
#define instance_get_member2(inst, name, type) \ *((type*)instance_get_member((inst),(name))) ... int i = instance_get_member2(pInst,"a", int);