2017-02-01 21 views
5

Sayaçların bulunduğu verilerin yanında saklandığından emin olmak için std::make_shared kullanmanız önerilir. Ne yazık ki dahili olarak std::make_shared<T>T için sıfır başlatma kullanır (yani veri bloğunu başlatmak için T() kullanır). Varsayılan başlatmayı kullanarak kandırmanın bir yolu var mı? std::shared_ptr<T>(new T, [](auto p){delete p;})'u kullanabileceğimi biliyorum, ama burada iki tahsis ile sonuçlanacağım (veri ve sayaç blokları birbirinin yanında olmayacak).std :: make_shared'i varsayılan başlatmayı kullanarak kandırmanın bir yolu var mı?

+2

Varsayılan "T" nin başlatılması T() 'dir. Yeni T' yeni T() ile aynı. Ayrıca, varsayılan silmeyi belirtmeye gerek yoktur. Tam olarak ne elde etmeye çalışıyorsun? –

+2

, varsayılan başlatmayı –

+3

@AndreiR yapan bir kurucuyla T sarıcısı yapar. Hayır, bu yanlış. 'T()', değer sıfırlamasıdır ve bu bir fark yaratabilir. – juanchopanza

cevap

9

Önemsiz yapıyı zorlamak için türetilmiş bir sınıf oluşturun. Türetilmiş sınıfı oluşturun, ancak istediğiniz ortak işaretçiye atayın. Bu tip-güvenli yıkıcının göre olduğunu

std::shared_ptr<T> p = std::make_shared<D>(); 

Demo.

Not. shared_ptr her zaman tip silme işlemini gerçekleştirir ve basit POD nesneleri için bile yıkıcı aramadan önce dinamik gönderim kullanır.

+0

@Potatoswatter Genius ile aynı değildir ... Bunun nasıl ortaya çıktığı hakkında hiçbir fikrim yok. –

+0

Evet ... Tip silme, std :: shared_ptr içinde gerçekten takdir etmediğim bir şeydir. Ama ben 4 farklı homegrown akıllı işaretçiler gibi büyük eski codebase ile başa - nasıl baktığına bakmaksızın std :: shared_ptr herhangi birinden daha iyidir :-) –

+0

Yum: 'template ListInit (Args && ... args): T {std :: forward (args) ...} {} ' – Yakk

İlgili konular