Hilfe beim Portieren
-
Hallo!
Ich programmiere grade eine DirectX11-Engine in C++, nutze aber die CLR für meinen Verwaltungsteil. Ich bin zwar in C++ selbst fit, hab aber noch nie Generics verwendet. Mein Problem ist jetzt, wie portiere ich folgende Klasse nach C++:
public sealed class xEntity { private List<xComponent> components = new List<xComponent>(); public T GetComponent<T>() where T : xComponent { T[] components = this.GetComponents<T>(); if (components.Length > 0) return components[0]; else return null; } public T[] GetComponents<T>() where T : xComponent { List<T> components = new List<T>(); foreach (var cmp in this.components) { if (!typeof(T).IsAssignableFrom(cmp.GetType())) continue; components.Add((T)cmp); } return components.ToArray(); } public T AddComponent<T>() where T : xComponent { T component = Activator.CreateInstance<T>(); this.components.Add(component); return component; } public void RemoveComponent<T>() where T : xComponent { List<T> components = new List<T>(); foreach (var cmp in this.components) { if (!typeof(T).IsAssignableFrom(cmp.GetType())) continue; components.Add((T)cmp); } this.components.RemoveAll((c) => components.Contains(c)); } /* Hier noch mehr kram, aber trivial */ }
Ich hab zwar schon folgendes gefunden, aber wenn ich null zurückliefern will, geht das nicht.
generic<typename T> where T:xComponent T GetComponent() { // Hier Code // Tut nicht: // return nullptr; }
Dabei tritt der Fehler C2440 auf, der sagt, dass nullptr nicht in T konvertiert werden kann (passiert auch bei cast).
Mein zweites Problem beim Portieren wäre diese Zeile:
if (!typeof(T).IsAssignableFrom(cmp.GetType()))
Wie portiere ich das typeof(T) ?
Wäre cool, wenn ich zeitnah Hilfe bekommen würde!
Gruß
Felix Queissner
-
FelixQu schrieb:
Hallo!
Ich hab zwar schon folgendes gefunden, aber wenn ich null zurückliefern will, geht das nicht.generic<typename T> where T:xComponent T GetComponent() { // Hier Code // Tut nicht: // return nullptr; }
Dabei tritt der Fehler C2440 auf, der sagt, dass nullptr nicht in T konvertiert werden kann (passiert auch bei cast).
Probiers mal mit generic<class T>
Mein zweites Problem beim Portieren wäre diese Zeile:
if (!typeof(T).IsAssignableFrom(cmp.GetType()))
Wie portiere ich das typeof(T) ?
Wäre cool, wenn ich zeitnah Hilfe bekommen würde!
Gruß
Felix QueissnerBenutze ::typeid
-
Wow, schnelle Antwort.
Hab jetzt das hier mal probiert:generic<class T> where T:xComponent T GetComponent() { //return nullptr; return (T)(xComponent^)nullptr; }
Das obere geht nicht, aber das untere. Blos ist das mit dem rumgecaste so korrekt?
Das mit ::typeid hat sofort funktioniert, danke!
-
FelixQu schrieb:
Wow, schnelle Antwort.
Hab jetzt das hier mal probiert:generic<class T> where T:xComponent T GetComponent() { //return nullptr; return (T)(xComponent^)nullptr; }
Das obere geht nicht, aber das untere. Blos ist das mit dem rumgecaste so korrekt?
Das mit ::typeid hat sofort funktioniert, danke!
Kannst auch einfach return (T)nullptr; schreiben das müsste auch gehen. Wenns weder nen Compile error noch nen Runtime error wirft dann machs so