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 Queissner

    Benutze ::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 😉


Anmelden zum Antworten