Gui*_*ndi 2 generics collections c++-cli
我正在用C++/CLI(VS2008)编写一个泛型类来存储和管理不同类型的记录,我需要集合来保存它们,然后再将它们刷新到DB/disk/etc. 我在考虑这样的事情:
ref class Record
{
// ...
};
generic<typename T>
where T : Record, gcnew()
public ref class Factory
{
public:
// ....functions....
protected:
array<T^> ^ StoredData;
};
Run Code Online (Sandbox Code Playgroud)
当然,错误C3229失败了(不允许对泛型类型参数进行间接).如果我删除'^',则错误是C3149(此处不能使用此类型而没有顶级'^').这很容易在VB.Net中完成(事实上,我正在迁移现有的VB.Net类!),但在C++中,我似乎已经走到了死胡同.这在C++/CLI中实际上是不可能的吗?
提前致谢.
你需要做的是:
public ref class Record
{
};
generic<typename T>
where T : Record, gcnew()
public ref class Factory
{
public:
// ....functions....
protected:
array<T> ^ StoredData;
};
Run Code Online (Sandbox Code Playgroud)
然后,您实例化集合,如下所示:
Factory<Record^>^ records = gcnew Factory<Record^>();
Run Code Online (Sandbox Code Playgroud)
这就是MSDN对C++中泛型的看法:
两种值类型(内置类型,如int或double或用户定义的值类型)和引用类型都可以用作泛型类型参数.无论如何,通用定义中的语法都是相同的.从语法上讲,将未知类型视为引用类型.但是,运行时能够确定实际使用的类型是否为值类型,并替换相应的生成代码以直接访问成员.用作泛型类型参数的值类型不会加框,因此不会受到与装箱相关的性能损失.泛型体内使用的语法应该是T ^和' - >'而不是'.'.如果type参数是值类型,则运行时将gcnew用于类型参数将适当地解释为值类型的简单创建.
所以这意味着,我认为,任何泛型类型参数都被视为托管类的指针,即T ^.实际上,您无法使用以下内容实例化泛型类:
Factory<Record>^ records = gcnew Factory<Record>();
Run Code Online (Sandbox Code Playgroud)
编译器将抛出此错误(即使您删除where T : Record, gcnew()):
error C3225: generic type argument for 'T' cannot be 'Record', it must be a value type or a handle to a reference type
Run Code Online (Sandbox Code Playgroud)