C++ 如何从不透明指针typedef生成共享的_ptr?(或:如何“展开”typedef?)

C++ 如何从不透明指针typedef生成共享的_ptr?(或:如何“展开”typedef?),c++,C++,如果您有一个不透明的指针typedef,是否有一种方法可以动态地引用指向的类型,例如,在模板中使用?例如,假设你有这样的东西: struct Foo; // Forward declared struct typedef Foo* FooPtr; // Opaque pointer 因为智能指针类型是指针类型的模板,所以要定义一个std::shared_ptr,您必须说: std::shared_ptr<struct Foo> theSharedPtr; std::shared_

如果您有一个不透明的指针typedef,是否有一种方法可以动态地引用指向的类型,例如,在模板中使用?例如,假设你有这样的东西:

struct Foo; // Forward declared struct
typedef Foo* FooPtr; // Opaque pointer
因为智能指针类型是指针类型的模板,所以要定义一个
std::shared_ptr
,您必须说:

std::shared_ptr<struct Foo> theSharedPtr;
std::shared_ptr theSharedPtr;
有没有办法定义这样一个指针而不用“手动”展开不透明指针typedef?我觉得我肯定错过了一些显而易见的东西,但你可能会想象这样的事情(注意:这些不起作用):

std::shared\u ptr共享指针;
//或
std::shared_ptr共享指针;
我觉得这应该是可能的。我错过什么了吗?我觉得这是一个迫在眉睫的时刻


编辑:再多花些时间,在常见的情况下,
shared\u ptr
似乎想要获得
sizeof(T)
。您可以通过向构造函数提供一个deleter来解决这个问题。我怀疑这会使这成为一个边缘情况,但是它似乎仍然与C++中的所有类型的争用一样,我应该能够“不用手动地打开”指针类型。

< P>是的,因为您已经使用C++ 11个特性,您可以这样做。特别是通过使用:

std::remove_pointer::type;//福
当然,您需要包括特定的标准标题,即:

#include <type_traits>
#包括
使用它。

在C++11中:

#include <type_traits>

typedef std::shared_ptr< std::remove_pointer< FooPtr >::type > theSharedPtr;
有没有办法定义这样一个指针而不用“手动”展开不透明指针typedef

#包括
std::shared_ptr共享指针;
在常见情况下,
shared\u ptr
似乎希望采用
sizeof(T)


它(可能)不需要大小;但是它的初始化需要创建一个deleter,其类型需要完整。

考虑到您使用的是std::shared\u ptr,显然您使用的是C++11。。。不管怎样,我会把剩下的答案留在这里。我喜欢答案的完整性。
#include <type_traits>
#include <type_traits>

typedef std::shared_ptr< std::remove_pointer< FooPtr >::type > theSharedPtr;
template<class T> struct remove_pointer;
template<class T> struct remove_pointer<T*> { typedef T type; };
#include <type_traits>
std::shared_ptr<std::remove_pointer<FooPtr>::type> theSharedPointer;