2016-01-28 26 views
10

Kullanarak libC++ Genel bölümünde std::shared_ptr::make_shared() statik üye işlevini buluyorum. haberler (1, 2) güvenilir bir kaynaktan statik üye işlevi make_shared hakkında hiçbir şey bahseder çünkü ben standart uyumluluğu hakkında endişe değilimstatik üye işlevi shared_ptr öğesinin make_shared'i

using T = int; 
using P = std::shared_ptr<T>; 
auto p = P::make_shared(123); // <=> std::make_shared<T>(123) 
static_assert(std::is_same< decltype(p), P >::value); 

: Ben zaten std::shared_ptr 'in uzmanlık tip takma tanımladıktan zaman çok kullanışlı std::shared_ptr.

Şu anda bu işlevi kullanmak için kötü bir uygulama var mı? Niye ya?

+1

Standartta yeterince iyi bir sebep olmadığı gerçeği değil midir? –

+0

Bu fonksiyonun standart olmadığını zaten biliyorsunuz. Bu sadece fikir temelli bir soru değil mi? – Brian

+0

Standart belirtimi kontrol ettim ve orada açıklanmadı. Bu uygulamaya özgü gibi görünüyor. Bu, VS2015 C++ standart kitaplığı ile çalışmaz. –

cevap

5

Bu statik make_shared üye işlevini kullanırken, zaten bildiğiniz gibi g ++/standart kitaplığının uygulamaya özel uzantısına bağlısınız. Ondan aldığınız küçük kazanç için, kodumu taşınabilir tutmayı ve std::make_shared'u kullanmayı tercih ederim.

Belirtilen durumda, yani kopya kullanarak yeni bir nesne oluşturma veya var olan bir yapıcıyı taşıma, bir alternatif önerebilirim (test edilmemiş; C++ 11 uyumluluğu için son bir dönüş türü eklemeniz gerekir) : yukarıdaki örnekte

template <typename T> 
auto share_ptr_to_new(T&& v) { 
    using T2 = typename std::remove_reference<T>::type; 
    return std::make_shared<T2>(std::forward<T>(v)); 
} 

, daha sonra sadece auto p = share_ptr_to_new(123) yazabiliriz.

+0

Benim için gerçekten yakın alternatif, kullanıcı ad alanında bir yerde std :: shared_ptr' için 'make_shared' [aşırı yükleme] (http://coliru.stacked-crooked.com/a/f87c5e9131d5eda7) 'dir. – Orient

3

FWIW olmayan bir üyesi fonksiyonu olarak

template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args); 

vardır.

std::shared_ptr::make_shared yerine std::make_shared kullanabilmeniz gerekir.

+0

Bu benim ve C++ 14'ün 'ile ilgilenen diğerleri için kopya kitap maxim. – Orient

+0

@Orient, Bunu anlamadım. –

+1

Kopya-kitap maxim eşanlamlıları: truism, ortak gerçek. – Orient

İlgili konular