C++ cli 我应该如何放置本机C++;NET泛型集合中的指针? 在C++中,不可能在托管.NET泛型集合中放置指向本机C++类的指针,例如 class A { public: int x; }; public ref class B { public: B() { A* a = GetPointerFromSomewhere(); a->x = 5; list.Add(a); } private: List<A*> listOfA; // <-- compiler error (T must be value type or handle) } A类{ 公众: int x; }; B级公共参考文献{ 公众: B() { A*A=GetPointerFromSomewhere(); a->x=5; 列表.添加(a); } 私人: List listOfA;//

C++ cli 我应该如何放置本机C++;NET泛型集合中的指针? 在C++中,不可能在托管.NET泛型集合中放置指向本机C++类的指针,例如 class A { public: int x; }; public ref class B { public: B() { A* a = GetPointerFromSomewhere(); a->x = 5; list.Add(a); } private: List<A*> listOfA; // <-- compiler error (T must be value type or handle) } A类{ 公众: int x; }; B级公共参考文献{ 公众: B() { A*A=GetPointerFromSomewhere(); a->x=5; 列表.添加(a); } 私人: List listOfA;//,c++-cli,C++ Cli,我一直使用的方法是将指针包装在托管值类中,然后重载取消引用运算符: template<typename T> public value class Wrapper sealed { public: Wrapper(T* ptr) : m_ptr(ptr) {} static operator T*(Wrapper<T>% instance) { return instance.m_ptr; } static operator const T*(co

我一直使用的方法是将指针包装在托管值类中,然后重载取消引用运算符:

template<typename T>
public value class Wrapper sealed
{
public:
    Wrapper(T* ptr) : m_ptr(ptr) {}
    static operator T*(Wrapper<T>% instance) { return instance.m_ptr; }
    static operator const T*(const Wrapper<T>% instance) { return instance.m_ptr; }
    static T& operator*(Wrapper<T>% instance) { return *(instance.m_ptr); }
    static const T& operator*(const Wrapper<T>% instance) { return *(instance.m_ptr); }
    static T* operator->(Wrapper<T>% instance) { return instance.m_ptr; }
    static const T* operator->(const Wrapper<T>% instance) { return instance.m_ptr; }
    T* m_ptr;
};
模板
公共值类包装器
{
公众:
包装器(T*ptr):m_ptr(ptr){}
静态运算符T*(包装器%instance){return instance.m_ptr;}
静态运算符const T*(const Wrapper%instance){return instance.m_ptr;}
静态T运算符*(包装器%instance){return*(instance.m_ptr);}
静态常量T&运算符*(常量包装器%instance){return*(instance.m_ptr);}
静态T*运算符->(包装器%instance){return instance.m_ptr;}
静态常量T*运算符->(常量包装%instance){return instance.m_ptr;}
T*m_ptr;
};
然后,我可以按如下方式自然地使用指针:

public ref class B {
public:
    B()
    {
        A* a = GetPointerFromSomewhere();
        a->x = 5;
        list.Add(Wrapper<A>(a));
        Console.WriteLine(list[0]->x.ToString());
    }
private:
    List<Wrapper<A>> listOfA;
}
公共参考B类{
公众:
B()
{
A*A=GetPointerFromSomewhere();
a->x=5;
添加(包装器(a));
Console.WriteLine(列表[0]>x.ToString());
}
私人:
清单a;
}

欢迎任何改进…

这是一种很好的基本方法,只要不需要在集合中进行任何内存管理,就可以将指针保存在列表中进行访问。