2012-07-03 59 views
3

在C++/CLI中,不可能將指針指向託管的.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) 
} 

是不允許的。我當然可以使用std::vector<A*> list;,但是我只能通過使用指針使list成爲託管類的成員,並且使用指向STL容器的指針感覺不自然。

在.NET泛型中存儲原生C++指針的好方法是什麼? (我在這裏對資源管理不感興趣;指針指向的對象在其他地方被管理)

回答

6

我一直在使用的方法是將指針包裝在託管值類中,然後重載引用運算符:

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; 
}; 

然後我就可以使用指針自然如下:

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; 
} 

任何改進歡迎...

+0

這只是將鼠標指針在存取權限列表一個很好的基本途徑只要你不需要在你的收藏中進行任何內存管理。 – CuppM