2013-03-13 12 views
9

Mam ogólną klasę myClass, która czasami potrzebuje przechowywać dodatkowe informacje o stanie w zależności od użycia. Zwykle robi się to z void*, ale zastanawiałem się, czy mogę użyć std::unique_ptr<void, void(*)(void*)>, aby pamięć została zwolniona automatycznie, gdy instancja klasy zostanie zniszczona. Problem polega na tym, że potrzebuję użyć niestandardowego deletera, ponieważ usunięcie pustki * powoduje niezdefiniowane zachowanie.Używanie std :: unique_ptr <void> z niestandardowym deleterem jako inteligentną pustą *

Czy istnieje sposób domyślnego skonstruowania std::unique_ptr<void, void(*)(void*)>, tak, że nie mam go najpierw skonstruować przy użyciu dummy deletera, a następnie ustawić prawdziwy deleter, kiedy używam void* dla struktury stanu? Czy istnieje lepszy sposób przechowywania informacji o stanie w klasie?

Oto przykładowy kod:

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

Naprawdę nie ma sensu używać wskaźników "void", gdy mamy szablony. –

+3

To brzmi jak problem [xy] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – Pubby

+0

Czy na pewno chcesz mieć tutaj 'unique_ptr', a nie' shared_ptr'? –

Odpowiedz

6

Prawdopodobnie bardziej intuicyjny sposób na przechowywanie dodatkowych informacji byłoby mieć interfejs IAdditionalData z wirtualnego destruktora. Bez względu na to, jakie struktury danych możesz dziedziczyć po IAdditionalData i przechowywać je w postaci std::unique_ptr<IAdditionalData>.

Zapewnia to również nieco więcej bezpieczeństwa typu, jak w przypadku statycznego rzutowania między IAdditionalData a rzeczywistym typem, zamiast reinterpret_cast pomiędzy void * i dowolnym typem danych.

+0

Możesz również static_cast między void * i typem celu. –

+0

@ R.MartinhoFernandes Możesz static_cast między void * i dowolnym typem. Nie oferuje żadnej gwarancji bezpieczeństwa typu. W przeciwieństwie do interfejsu. –

+0

static_cast z IAdditionalData do SomeDerivedAdditionalData nie jest dużo bezpieczniejsze niż void * do SomeDerivedAdditionalData, chociaż (przynajmniej nie w żaden istotny sposób). –

Powiązane problemy