Generics 本机类型和泛型

Generics 本机类型和泛型,generics,reflection,c++-cli,managed,native-code,Generics,Reflection,C++ Cli,Managed,Native Code,我想创建一个本机数组并通过托管代码访问它。我不想将代码重新写入不同的类型,(int,long,float,double)因此尝试使用泛型 typedef int IND; 通用的 公共参考类ntvarray { 无效*pnt; 工业司; 公众: ntvarray(IND长度) { sz=sizeof(T); pnt=::运算符新(长度*sz); } ~ntvarray() { ::操作员删除(pnt); } void*指针() { 返回pnt; } T getitem(索引索引) { //c32

我想创建一个本机数组并通过托管代码访问它。我不想将代码重新写入不同的类型,(
int
long
float
double
)因此尝试使用泛型

typedef int IND;
通用的
公共参考类ntvarray
{
无效*pnt;
工业司;
公众:
ntvarray(IND长度)
{
sz=sizeof(T);
pnt=::运算符新(长度*sz);
}
~ntvarray()
{
::操作员删除(pnt);
}
void*指针()
{
返回pnt;
}
T getitem(索引索引)
{
//c3229
返回((T*)pnt)[索引];
}
无效集合项(索引,T值)
{
//c3229
((T*)pnt)[指数]=数值;
}
};
我得到了错误,我知道这个错误的原因

错误C3229:
'T*”
:不允许对泛型类型参数进行间接寻址


然而,有没有一种方法可以使用泛型来实现这一点?要做到这一点,除了使用泛型之外,还有其他方法吗?

不,不能使用泛型。但是你可以使用模板。这避免了您的问题所强调的代码重复,但不允许像泛型那样进行运行时实例化。

实际上,我希望在托管代码中使用多个类型的类而不重复代码。除了泛型,我看不到任何其他方法。但是,泛型也不支持专门化:(托管代码链接此代码在c#中,不能使用模板类。引用具有上述代码的程序集的c#代码将如何访问模板类?@Annifer:是的,这很不幸。我假设使用此代码的c#代码也是泛型的?我要做的是(1)声明一个泛型
接口类
(2)将此代码更改为模板,并使其实现通用接口(3)创建一个工厂函数,该函数接受
系统。键入
,并创建一个新的匹配对象(这将导致所有模板变体的实例化).C#不在乎类是用模板创建的,因为它知道如何使用泛型接口。好的!它可以工作!谢谢。工厂函数完成了这项工作。但是它比它的非泛型版本慢了一倍。。正如预期的那样。@Annifer:希望只有创建速度慢,然后使用接口非常快?但是,是的,通过int调用eFace可能会稍微慢一点,因为JIT编译器内联要困难得多。