Was ist die richtige Art zu Casting (in C++/CLI) von einem nativen Code enum
zu einem verwalteten Code enum
, die die gleichen enum
Werte enthalten? Gibt es einen Unterschied zur Verwendung der C# -Wegweise wie zum Beispiel (int)
in C++/CLI.C++/CLI: Casting von unmanaged enum zu verwaltet enum
Antwort
Angenommen, Ihre nativen Code ist
enum shape_type_e
{
stUNHANDLED = 0, //!< Unhandled shape data.
stPOINT = 1 //!< Point data.
...
};
und verwaltetem Code ist
public enum class ShapeType
{
Unhandled = 0,
Point = 1,
...
};
Sie vom verwalteten zum nativen werfen können mit
shape_type_e nativeST = stPOINT;
ShapeType managedST = static_cast<ShapeType>(nativeST);
Debug.Assert(managedST == ShapeType::Point);
ich immer static_cast
verwenden, nicht die C# Art des Castings.
Kommt drauf an. Wenn Sie zum Beispiel eine CLI-Enumeration haben, die einen zugrunde liegenden Typ von ushort hat, kann sie keinen Wert von 257 enthalten. Standardmäßig basiert die CLI enum auf int, was in den meisten Fällen in Ordnung sein sollte. Wenn Ihr systemeigener C++ - Code bei Enums unsignierte 32-Bit-Ints/64-Bit-Ints als zugrunde liegenden Typ verwendet, wechseln Sie die Basis Ihrer CLI-Enumeration zu UInt32, long oder ulong.
Ich werde dieses Problem nicht haben, da beide enum vom Typ int sind. Aber welche Art von Cast sollte in diesem Fall verwendet werden? Sollte es const_cast, static_cast, dynamic_cast, reinterpret_cast, safe_cast oder nur die C# -Casting sein (ein Beispiel ist (int))? – Lopper
Aus dem obigen Code, nehme ich an, dass Sie von nativen zu verwalteten enum casten. Was ist umgekehrt von "gemanagt" zu "nativ"? – Lopper
Statische Besetzung ist Ihr Freund in beide Richtungen ... nativeST = statischer_cast (managedST); –
mcdave
Danke mcdave! :) – Lopper