C# 在C中使用void指针作为模板和函数参数# 作为一个C++狂热分子,我迫切需要在C语言中使用空洞指针。手头的任务要求我在编译时不知道某个变量的类型。 因此,我考虑准备一个结构,其中包含在运行时识别类型所需的所有信息。现在,这个想法在C++中会起作用,但是,C++并不完全是C++。 特别是,我需要定义一个: private List<KeyValuePair<string, KeyValuePair<string, void*>>> mappings;

C# 在C中使用void指针作为模板和函数参数# 作为一个C++狂热分子,我迫切需要在C语言中使用空洞指针。手头的任务要求我在编译时不知道某个变量的类型。 因此,我考虑准备一个结构,其中包含在运行时识别类型所需的所有信息。现在,这个想法在C++中会起作用,但是,C++并不完全是C++。 特别是,我需要定义一个: private List<KeyValuePair<string, KeyValuePair<string, void*>>> mappings;,c#,C#,同样,在这种情况下是不允许的:错误2类型“void*”不能用作类型参数 有办法解决这些问题吗 谢谢你的帮助 VoU**/Cord>可以指向任何东西。 在C#中,所有事物都来自System::Object,因此Object可以引用任何实例。在C++中使用 KEYValuePaule .< /P> < P>,Vult*/Cord>可以指向任何东西。 在C#中,所有事物都来自System::Object,因此Object可以引用任何实例。只要使用KeyValuePair就可以了,正如本所指出的,你可能

同样,在这种情况下是不允许的:错误2类型“void*”不能用作类型参数 有办法解决这些问题吗


谢谢你的帮助代码> VoU**/Cord>可以指向任何东西。
在C#中,所有事物都来自
System::Object
,因此
Object
可以引用任何实例。在C++中使用<代码> KEYValuePaule .< /P> < P>,Vult*/Cord>可以指向任何东西。


在C#中,所有事物都来自
System::Object
,因此
Object
可以引用任何实例。只要使用
KeyValuePair

就可以了,正如本所指出的,你可能实际上不需要做这种疯狂的事情。C类型系统已经支持通用的“对象”引用类型。您可以使用“is”和“as”操作符以及“GetType()”方法对任何托管对象进行运行时类型分析。我怀疑您正在构建一个不必要的设备


如果确实需要通过void指针跟踪内容,并且确实需要生成void指针的通用映射,那么使用System.IntPtr作为类型参数。IntPtr是指针大小的整数,您可以将void*转换为IntPtr,然后再转换回来,不会有太多困难

正如本所说,你可能实际上不需要做这种疯狂的事情。C类型系统已经支持通用的“对象”引用类型。您可以使用“is”和“as”操作符以及“GetType()”方法对任何托管对象进行运行时类型分析。我怀疑您正在构建一个不必要的设备


如果确实需要通过void指针跟踪内容,并且确实需要生成void指针的通用映射,那么使用System.IntPtr作为类型参数。IntPtr是指针大小的整数,您可以将void*转换为IntPtr,然后再转换回来,不会有太多困难

:wq
。。。检测到vim用户:)
:wq
。。。vim用户检测到:)抱歉:wq\!我想旧习惯很难改掉。。谢谢你的帮助!具有讽刺意味的是,并不是所有东西都源于对象。特别是,指针类型不需要;这就是为什么不能将它们用作类型参数。@Eric:Pedantism级别增加。@kvb:Fail。学究主义失败了。抱歉:wq\!我想旧习惯很难改掉。。谢谢你的帮助!具有讽刺意味的是,并不是所有东西都源于对象。特别是,指针类型不需要;这就是为什么不能将它们用作类型参数的原因。@Eric:Pedanticism级别提高了。@kvb:Fail。学究主义失败了。即使是
IntPtr
也不能完全取代
void*
。在C++中, Value*/Cux>可以针对堆上的实例对象。在C#中,需要进行一些重构(我相信,这与闭包捕获值类型变量时所做的相同),然后
object
将引用容器类型。在C++/CLI中,有一个
interior_ptr
类型,但它仅限于堆栈使用,因此不能存储在
字典中。这句格言的另一个例子是:“计算机科学中的任何问题都可以通过增加一层间接性来解决。”。它扩展了C++的能力。现在,我将要做一个可能冲突的声明:甚至在某些情况下,甚至可以模拟动态类型。@ HORACV:如果您的代码有“代码> Value*/Cuth>,它比C++更大。如果您使用的是C++特性,比如模板鸭子类型,那么您可以完全避免使用<代码> Value*/Cuff>。C++0x lambdas将使这变得更加容易。即使是
IntPtr
也不能完全取代
void*
。在C++中, Value*/Cux>可以针对堆上的实例对象。在C#中,需要进行一些重构(我相信,闭包捕获值类型变量时所做的提升与此相同),然后
object
将工作以引用容器类型。在C++/CLI中,有一个
interior_ptr
类型,但它仅限于堆栈使用,因此不能存储在
字典中。这句格言的另一个例子是:“计算机科学中的任何问题都可以通过增加一层间接性来解决。”。它扩展了C++的能力。现在,我将要做一个可能冲突的声明:甚至在某些情况下,甚至可以模拟动态类型。@ HORACV:如果您的代码有“代码> Value*/Cuth>,它比C++更大。如果您使用的是C++特性,比如模板鸭子类型,那么您可以完全避免使用<代码> Value*/Cuff>。而C++0x lambdas将使这变得更加容易。
 public unsafe void addMapping(string name, string internal_name, void* storage)