Wieder neue C++ Version?



  • audacia schrieb:

    Zeus schrieb:

    dass geht soweit, dass du Template-Instanzierte Objekte mit Hilfe von Generic Interface über die Module propagieren kannst.

    Ich verstehe kein Wort.

    Mein nachtragende Code ansehen, eine Instanz von Pair kann aus jede Programmiersprache zugegriffen werden, JavaScript, C#.



  • Zeus schrieb:

    eine Instanz von Pair kann aus jeder Sprache zugegriffen werden, JavaScript, C#.

    Okay, eine Instanz also - aber ich kann nicht cross-boundary instantiations vornehmen, oder?



  • audacia schrieb:

    Zeus schrieb:

    eine Instanz von Pair kann aus jeder Sprache zugegriffen werden, JavaScript, C#.

    Okay, eine Instanz also - aber ich kann nicht cross-boundary instantiations vornehmen, oder?

    Wenn du damit meinst, dass du in JavaScript einen C++ geschriebene WinRT Typ instanzieren kann, dann lautet die Antwort: Doch, natürlich.



  • audacia schrieb:

    Zeus schrieb:

    eine Instanz von Pair kann aus jeder Sprache zugegriffen werden, JavaScript, C#.

    Okay, eine Instanz also - aber ich kann nicht cross-boundary instantiations vornehmen, oder?

    Da bin ich unsicher jetzt, ich denke aber schon, aber beschränkt auf Generics.
    Der Hauptpunkte,der mir im Kopf geblieben sind, sind die Intregationsfeature vom C++/STL Code.



  • dot schrieb:

    audacia schrieb:

    Zeus schrieb:

    eine Instanz von Pair kann aus jeder Sprache zugegriffen werden, JavaScript, C#.

    Okay, eine Instanz also - aber ich kann nicht cross-boundary instantiations vornehmen, oder?

    Wenn du damit meinst, dass du in JavaScript einen C++ geschriebene WinRT Typ instanzieren kann, dann lautet die Antwort:

    Nein. Ich meine das:

    // C++ - Modul 1
    template[generic?] <typename T>
        class vector
    {
        ...
    };
    
    // C# - Modul 2
    struct MyStruct
    {
        public int someData;
    }
    
    ...
    
    vector<MyStruct> myVector; // Template-/Generic-Instantiierung jenseits der Modulgrenze, speziell mit einem auf der "anderen Seite" definierten Typargument
    


  • Ja mit Generics, nicht mit Template.
    btw das ist doch, was dot beschrieben hat o.O


  • Administrator

    audacia schrieb:

    Zeus schrieb:

    dass geht soweit, dass du Template-Instanzierte Objekte mit Hilfe von Generic Interface über die Module propagieren kannst.

    Ich verstehe kein Wort.

    Naja, ca. so:

    public ref class TheInterface
    {
    public:
      void IsHere(IPair<int, int>^ pair);
    };
    
    // ...
    TheInterface^ interface = GetTheInterface();
    interface->IsHere(ref new Pair<int, int>(4, 5));
    

    Die Templateklasse Pair<int, int> wird somit als Genericklasse IPair<int, int> über die Modulgrenze gereicht. Pair<int, int> kann man nicht durchreichen, aber IPair<int, int> schon. Auch ist IPair (ohne Typenangabe) über die Modulgrenze verwendbar, dagegen ist das Klassentemplate Pair nur in C++ verwendbar.
    Man kann schlussendlich aus Templates Genericklassen bauen, welche in der Schnittstelle verwendet werden können.

    Am besten schaust du dir das Video an 😃
    Edit: Wups, da kamen noch ein paar andere Antworten zuvor. Naja, vielleicht ist meine trotzdem noch hilfreich 🙂

    dot schrieb:

    Dravere schrieb:

    5. Hätte man diese WinRT Anbindung nicht auch mit normalen C++ erreichen können und einfach einer mordernen C++ API?

    Nein, da "normales" C++ kein ABI definiert und vor allem will man ja nicht nur C++, sondern alle möglichen Sprachen unterstützen.

    Ich weiss nicht. Klar hat C++ kein ABI, aber man hätte doch etwas in einer Bibliothek zur Verfügung stellen können. Ähnlich wie das andere Bibliotheken, wie zum Beispiel CORBA auch tun. Ich denke, dass es schon möglich gewesen wäre. Man müsste sich das nur mal klar durchdenken, aber dazu fehlt mir aktuell die Zeit.

    Grüssli



  • Ja klar, nach meinem Verständnis sollte das einfach so funktionieren.



  • Okay, dem Video nach verstehe ich das anders. Kein Wort darüber, wie C# einen generischen Typen mit einem eigenen Typparameter instantiieren könnte. Nur Interfaces herumreichen ist möglich, und der dahinterliegende Typ muß natürlich dort instantiiert sein, wo auch die Template-/Generic-Klasse definiert ist. Also

    IPair<foo, bar> myUri = GetUri ();
    

    geht in jeder Sprache, nur GetUri() kann ich nicht in jeder Sprache schreiben, nur weil es ich schon eine Implementierung für IPair<foo, bar> in C++ habe - ich muß dann meine eigene Implementierung für IPair<foo, bar> in der jeweiligen Sprache schreiben.

    00:36:00 schrieb:

    ... the way to think of it is that every instantiation of this ref class template is a ref class. That's all you need to know. So you can't just export the template itself and imagine other languages would know how to deal with it and instantiate it; that's not how it works. You have to instantiate it in C++. [...]

    Bei .NET kann ich ja über Modulgrenzen instantiieren, weil das vom JITter gemacht wird und nicht wie bei C++ zur Übersetzungszeit passiert. Ich hätte mich schon sehr gewundert, wenn sie so etwas auch für WinRT vorgesehen hätten.



  • Ich versteh nicht ganz, was daran so verwunderlich ist. Ich konnte COM Komponenten immer schon in einer Sprache schreiben und einer völlig anderen Sprache verwenden!? COM unterstützt nun eben auch Generics und Exceptions...



  • dot schrieb:

    Ich versteh nicht ganz, was daran so verwunderlich ist.

    Ja, das merke ich. Nevermind; wir werden sehen, wie es funktioniert, wenn's draußen ist.



  • Ich glaub nicht, dass WinRT generics irgendwas mit .NET generics zu tun haben, wo zur Laufzeit Code generiert wird. Ich denk, dass es sich dabei eher um eine Art besseres Namemangling handelt. Denn ich kann damit ja nur generische Interfaces deklarieren.



  • dot schrieb:

    Ich glaub nicht, dass WinRT generics irgendwas mit .NET generics zu tun haben, wo zur Laufzeit Code generiert wird. Ich denk, dass es sich dabei eher um eine Art besseres Namemangling handelt. Denn ich kann damit ja nur generische Interfaces deklarieren.

    So verstehe ich das auch. Dann waren meine Beispiele vorhin nicht klar genug?



  • Ich hab vorhin nicht ganz verstanden, was du gemeint hast. Aber gut, dann waren wir ja sowieso schon von Anfang an einer Meinung 😉



  • Hier hat einer schon etwas tiefer reingeschaut, man kann auch ohne die "C++ Projektion" auf WinRT zugreifen:

    http://www.interact-sw.co.uk/iangblog/2011/09/16/real-native-winrt


Anmelden zum Antworten