マネージC ++ / CLIクラスのauto_ptrまたはshared_ptrと同等
-
05-07-2019 - |
質問
C ++ / CLIでは、マネージクラスでネイティブクラスのメンバーを保持することが許可されていないため、マネージクラスでネイティブ型を使用できます。その場合はポインターを使用する必要があります。
例を次に示します。
class NativeClass
{
....
};
public ref class ManagedClass
{
private:
NativeClass mNativeClass; // Not allowed !
NativeClass * mNativeClass; // OK
auto_ptr<NativeClass> mNativeClass; //Not allowed !
boost::shared_ptr<NativeClass> mNativeClass; //Not allowed !
};
C ++ / CLIの世界でshared_ptrと同等のものを知っている人はいますか?
編集: 「1800-Information」というご提案をお寄せいただきありがとうございます。あなたの提案に続いて、私はSTL.Netについて確認しましたが、Visual Studio 2008でのみ利用可能であり、コンテナ+アルゴリズムを提供しますが、スマートポインタは提供しません。
解決
codeproject で答えを見つけました:
Nishant Sivakumarがこれに関する記事を http://www.codeproject.comに投稿しました/KB/mcpp/CAutoNativePtr.aspx
このページで、Denis N. Shevchenkoのコメントも参照してください。彼は、非常にうまく機能するstlのような実装を提供しています。
他のヒント
これを完全にはテストしていませんが、次のようなものはどうですか:
#pragma once
#include <memory>
template <class T>
public ref class m_shared_ptr sealed
{
std::shared_ptr<T>* pPtr;
public:
m_shared_ptr()
: pPtr(nullptr)
{}
m_shared_ptr(T* t) {
pPtr = new std::shared_ptr<T>(t);
}
m_shared_ptr(std::shared_ptr<T> t) {
pPtr = new std::shared_ptr<T>(t);
}
m_shared_ptr(const m_shared_ptr<T>% t) {
pPtr = new std::shared_ptr<T>(*t.pPtr);
}
!m_shared_ptr() {
delete pPtr;
}
~m_shared_ptr() {
delete pPtr;
}
operator std::shared_ptr<T>() {
return *pPtr;
}
m_shared_ptr<T>% operator=(T* ptr) {
pPtr = new std::shared_ptr<T>(ptr);
return *this;
}
T* operator->() {
return (*pPtr).get();
}
};
これにより、refクラスでC ++ 11 / Boostのshared_ptrsを交互に使用できるようになります。
STL.Netはここに文書化されています。私はそれがどのような状態にあるのか、それがあなたにとってどのような用途なのかわかりません。
所属していません StackOverflow