如果你有一个不透明的指针typedef,有没有办法动态引用指向的类型,比如说,在模板中使用?例如,假设你有类似的东西:
struct Foo; // Forward declared struct
typedef Foo* FooPtr; // Opaque pointer
因为智能指针类型是指针类型的模板,为了定义std::shared_ptr
,你似乎不得不说:
std::shared_ptr<struct Foo> theSharedPtr;
有没有办法定义这样的指针而没有&#34;手动&#34;展开不透明指针typedef?我觉得我必须在这里遗漏一些明显的东西,但你可能会想到这样的东西(注意:这些不起作用):
std::shared_ptr<*FooPtr> theSharedPointer;
// or
std::shared_ptr<pointedto(FooPtr)> theSharedPointer;
我觉得这应该是可能的。我错过了什么吗?我觉得这是一个即将来临的前额... ...
编辑:在更多的情况下,看来,在通常情况下,shared_ptr<T>
想要采用sizeof(T)
。你可以通过为构造函数提供一个删除器来解决这个问题。我怀疑这使得这有点像一个边缘情况,但它仍然似乎与C ++中的所有类型争论,我应该能够&#34;展开&#34;指针类型,但不是手动执行。
答案 0 :(得分:23)
在C ++ 11中:
#include <type_traits>
typedef std::shared_ptr< std::remove_pointer< FooPtr >::type > theSharedPtr;
在C ++ 03中,你可以用完全相同的方式使用boost::remove_pointer
。
如果您不想包含boost,那么编写remove_pointer
元函数非常简单:
template<class T> struct remove_pointer;
template<class T> struct remove_pointer<T*> { typedef T type; };
答案 1 :(得分:5)
是的,因为您已经在使用C ++ 11功能,所以可以使用type traits执行此操作。具体来说,使用std::remove_pointer
:
std::remove_pointer<Foo*>::type; // Foo
当然,您需要包含特定的标准标题:
#include <type_traits>
使用它。
答案 2 :(得分:2)
有没有办法在没有“手动”展开不透明指针typedef的情况下定义这样的指针?
#include <type_traits>
std::shared_ptr<std::remove_pointer<FooPtr>::type> theSharedPointer;
在通常情况下,
shared_ptr<T>
似乎想要sizeof(T)
。
它(可能)不需要大小;但它的初始化需要创建一个删除器,类型需要完成。