一部の C# コードを C++/CLI コードに変換しようとしましたが (いくつかのパフォーマンス上の理由と、相互運用の問題を回避するため)、壁にぶつかりました。確かに、私の C++/CLI の知識は (最高の状態で) 不足しています。
サイズのキャッシュに使用した一般的な静的クラスを変換しようとすると、大きな頭痛の種になることがわかっています。
C# クラスは次のとおりです。
public static class SizeCache<T>
{
public static int Size = Marshal.SizeOf(typeof(T));
}
C++/CLI ラッパー (私が入手した限り) は次のとおりです。
generic <typename T>
public ref class SizeCache abstract sealed
{
private:
static SizeCache()
{
Size = Marshal::SizeOf(T::typeid);
}
public:
static int Size;
};
ただし、次の方法でアクセスすると、すべてが正常にコンパイルされるようです。
int size = SizeCache<T>::Size;
コンパイラ エラーが発生します。
エラー C2039: 'サイズ' : '`グローバル名前空間'' のメンバーではありません
エラー C2065: 'サイズ': 宣言されていない識別子
残念ながら、この場合、何が間違っているのかわかりません。
そもそもクラスを使用する理由は、マーシャラーに関する問題 (特にジェネリック構造体型を処理する場合) を回避し、同じ基本型で SizeOf を常に呼び出すことによって発生するパフォーマンス ヒットを回避するためです。
ここで何が間違っていますか?