Seite 1 von 1

[C++] new_unique, new_shared ...

Verfasst: 21.08.2012, 19:44
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.

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

Verfasst: 21.08.2012, 21:57
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.

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

Verfasst: 21.08.2012, 22:03
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.

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

Verfasst: 21.08.2012, 22:28
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?

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

Verfasst: 21.08.2012, 23:00
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.