2013-03-13 6 views
9

Ich habe eine generische Klasse myClass, die manchmal zusätzliche Statusinformationen abhängig von der Verwendung speichern muss. Dies geschieht normalerweise mit einer void*, aber ich frage mich, ob ich eine std::unique_ptr<void, void(*)(void*)> verwenden könnte, so dass der Speicher automatisch freigegeben wird, wenn die Klasseninstanz zerstört wird. Das Problem ist, dass ich dann einen benutzerdefinierten Deleter verwenden muss, da das Löschen eines void * zu undefiniertem Verhalten führt.Verwenden von Std :: unique_ptr <void> mit einem benutzerdefinierten Deleter als eine intelligente void *

Gibt es eine Möglichkeit, ein std::unique_ptr<void, void(*)(void*)> Standard zu konstruieren, so dass ich es nicht zuerst mit einem Dummy-Löscher konstruieren Sie dann einen echten Deleter gesetzt, wenn ich die void* für eine State-Struktur verwenden? Oder gibt es eine bessere Möglichkeit, Statusinformationen in einer Klasse zu speichern? Hier

ist ein Beispielcode:

void dummy_deleter(void*) { } 

class myClass 
{ 
public: 
    myClass() : m_extraData(nullptr, &dummy_deleter) { } 
    // Other functions and members 
private: 
    std::unique_ptr<void, void(*)(void*)> m_extraData; 
}; 
+7

Es gibt wirklich nicht viel Verwendung für 'void' Zeiger, wenn wir Vorlagen haben. –

+3

Das klingt wie ein [xy-Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – Pubby

+0

Sind Sie sicher, dass Sie hier ein 'unique_ptr' und kein 'shared_ptr' wollen? –

Antwort

6

Wahrscheinlich eine intuitive Art und Weise zusätzliche Informationen zu speichern, wäre eine Schnittstelle haben IAdditionalData mit einem virtuellen Destruktor. Welche Datenstrukturen Sie auch haben, würde von IAdditionalData erben und in einem std::unique_ptr<IAdditionalData> gespeichert werden.

Dies bietet auch ein bisschen mehr Typ Sicherheit, wie Sie zwischen IAdditionalData und dem tatsächlichen Typ statisch statt reinterpret_cast zwischen void * und was auch immer Datentyp würde.

+0

Sie können static_cast zwischen void * und dem Zieltyp eingeben. –

+0

@ R.MartinhoFernandes Sie können static_cast zwischen void * und einem beliebigen Typ. Es bietet keine Art Sicherheitsgarantie. Im Gegensatz zu einer Schnittstelle. –

+0

static_cast von IAdditionalData zu SomeDerivedAdditionalData ist nicht viel sicherer als void * zu SomeDerivedAdditionalData (zumindest nicht in irgendeiner wichtigen Weise). –

Verwandte Themen