[C++] new_unique, new_shared ...

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

[C++] new_unique, new_shared ...

Beitrag von CodingCat »

Für alle, die von sichereren Alternativen zu new träumen, ohne wahlweise IntelliSense oder Lesbarkeit einzubüßen:

Code: Alles auswählen

int main()
{
   auto p = new_unique int;
   auto a = new_unique_array int[5];
 
   std::cout << typeid(p).name() << std::endl; // unique_ptr<int>
   std::cout << typeid(a).name() << std::endl; // unique_ptr<int[]>
 
   return 0;
}
Das geht tatsächlich nicht erst 2021, 2041 oder 2061; nein, das geht schon heute:

Code: Alles auswählen

#include <memory>
 
namespace language_ext
{
 
struct new_unique_seed { };
 
template <class T>
inline std::unique_ptr<T> operator *(new_unique_seed, T *p)
{
   return std::unique_ptr<T>(p);
}
 
struct new_unique_array_seed { };
 
template <class T>
inline std::unique_ptr<T[]> operator *(new_unique_array_seed, T *p)
{
   return std::unique_ptr<T[]>(p);
}
 
}

#define new_unique ::language_ext::new_unique_seed() * new
#define new_unique_array ::language_ext::new_unique_array_seed() * new
In Action: http://ideone.com/HfPHw

Hausaufgabe: Anwendung auf andere Smart Pointers, z.B. shared_ptr.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: [C++] new_unique, new_shared ...

Beitrag von eXile »

Das ist natürlich eine absolut gangbare Lösung, nur frage ich mich bei solchen Lösungen manchmal, ob man sich damit nicht die Sprache kaputt #defined. Alternativ könnte man sagen, dass Microsoft jetzt keine Ausrede mehr hat, Spracherweiterungen wie ref new in dem Compiler fest zu verdrahten.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [C++] new_unique, new_shared ...

Beitrag von CodingCat »

Natürlich wäre mir ein Mechanismus ohne #define lieber, aber ich finde keinen, der zugleich mit aktuellen IDEs kompatibel und schmerzfrei benutzbar ist. Ich habe die eingangs vorgeschlagene Lösung auch noch nirgends so umgesetzt, sie war vielmehr ein spontanes Gedankenspiel. Tatsächlich lässt sich das Problem so auch nur für new lösen, langfristig kommt man um eine IDE-Erweiterung für Perfect Forwarding gar nicht drumrum. Angesichts der aktuellen Entwicklungen habe ich nur die Angst, dass C++11 genau aus diesem Grund nie wirklich angenommen werden könnte, und wir womöglich auf ewig ins C-Mittelalter verdammt sein werden.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Jonathan
Establishment
Beiträge: 2660
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [C++] new_unique, new_shared ...

Beitrag von Jonathan »

Hm, was genau bezweckt man damit? War mir beim ersten lesen nicht so ganz klar. Einfach ein hübscheres Anlegen von unique_ptr's?
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [C++] new_unique, new_shared ...

Beitrag von CodingCat »

Ja, das Eingangsbeispiel war in dieser Hinsicht nicht wirklich aufschlussreich. Sobald man Konstruktoren mit mehreren Parametern hat, hat man die Wahl zwischen make_unique<T>(p1, p2, p3, p4) und unique_ptr<T>( new T(p1, p2, p3, p4) ), wobei man in erstem Fall mangels IDE-Unterstützung für Perfect Forwarding keinerlei Information über die Bedeutung der Parameter des tatsächlich aufgerufenen Konstruktors angezeigt bekommt, während man im zweiten Fall immer unschöne Redundanz und überflüssige Klammern eingeht.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Antworten