2014-04-03 25 views
15

Eğer opak bir işaretçi tipedefiniz varsa, şablonlarda kullanmak için sivri uçlu türe dinamik olarak başvurmanın bir yolu var mıdır? Akıllı işaretçi tipleri şablonları işaretçi-bu bir std::shared_ptr tanımlamak için, yazın, size söylemek zorunda gibi görünüyor açısından ÇünküNasıl opak bir işaretçi typedef bir shared_ptr yapabilirim? (veya: typedef'i nasıl açabilirim?)

struct Foo; // Forward declared struct 
typedef Foo* FooPtr; // Opaque pointer 

: Örneğin, böyle bir şey var ki

std::shared_ptr<struct Foo> theSharedPtr; 

Böyle bir işaretçiyi "el ile" opak işaretçisi typedef unwrapping olmadan tanımlamak için herhangi bir yolu var mı? Burada belirgin bir şey eksik olmalı gibi hissediyorum, ancak bu gibi bir şey hayal olabilir (not: bunlar çalışmaz): Bu mümkün olması gerektiği gibi

std::shared_ptr<*FooPtr> theSharedPointer; 
// or 
std::shared_ptr<pointedto(FooPtr)> theSharedPointer; 

hissediyorum. Bir şey mi eksik? Bunun gibi hissettiren bir alnı-şapırdayan an ...

DÜZENLEME: Bazılarında etrafta dolaşmak, ortak durumda, shared_ptr<T>'un sizeof(T)'u almak istediği anlaşılıyor. Kurucuya bir delici sağlayarak bunu aşabilirsiniz. Bu durumun biraz da olsa bir durum oluşturduğundan şüpheleniyorum, ama yine de C++ 'da tüm türlerin boğulması gibi görünüyor, bir işaretçi türünü el ile yapmadan "açıp kapamayı" beceremem gerekiyor.

cevap

23

: C++ 03 tam aynı şekilde boost::remove_pointer kullanabilirsiniz yılında

#include <type_traits> 

typedef std::shared_ptr< std::remove_pointer<FooPtr>::type > theSharedPtr; 

.

Bir remove_pointer üst-işlevin yazma, destek dahil etmek istemiyorsanız

oldukça kolaydır: "manuel" opak işaretçi typedef unwrapping olmadan böyle bir işaretçi tanımlamak için herhangi bir yolu

template<class T> struct remove_pointer; 
template<class T> struct remove_pointer<T*> { typedef T type; }; 
+2

İyi düşünmüyorsanız, std :: shared_ptr 'in C++ 11' de olduğunuzu açıkça göreceksiniz ... Cevabımın geri kalanını yine de burada bırakacağım. – sbabbi

+0

Cevabın bütünlüğünü beğeniyorum. –

5

Evet, zaten C++ 11 özelliklerini kullandığınızdan, bunu type traits ile yapabilirsiniz. Özellikle std::remove_pointer kullanarak:

#include <type_traits> 

kullanmak için: Elbette

std::remove_pointer<Foo*>::type; // Foo 

sizsiniz belirli standart başlığı dahil gerekir. C++ 11 yılında

2

var mı?

#include <type_traits> 
std::shared_ptr<std::remove_pointer<FooPtr>::type> theSharedPointer; 

ortak durumda shared_ptr<T>sizeof(T) almak istiyor, görünür

.

Bu (büyük ihtimalle) boyutlara ihtiyaç duymaz; fakat onun başlatılmasının, türün tamamlanmış olması gereken bir deletici yaratması gerekiyor.

İlgili konular