如何从不透明指针typedef创建shared_ptr? (或:我如何“解包”typedef?)

时间:2014-04-03 13:20:44

标签: c++

如果你有一个不透明的指针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;指针类型,但不是手动执行。

3 个答案:

答案 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)

它(可能)不需要大小;但它的初始化需要创建一个删除器,类型需要完成。