C++ 不透明类型C-指向共享\u ptr的指针

C++ 不透明类型C-指向共享\u ptr的指针,c++,pointers,boost,smart-pointers,C++,Pointers,Boost,Smart Pointers,我遇到了以下情况。(更新:被称为不透明类型;感谢info@iharob) p类型在public_api.h中是typedef-ed,还有一些创建、修改和销毁它的函数,例如下面代码段中的createP 但是,它的实现基于一个隐藏类型。隐藏,因为它是在源代码中定义的,通常作为已编译的二进制文件提供,可以安装。每个这样的操作都依赖于指针类型转换 我的用例简化如下: #包括 使用std::cerr; #包括 /*在**公共**api中定义*/ //_PUB_API_{{{ typedef结构P; P*c

我遇到了以下情况。(更新:被称为不透明类型;感谢info@iharob)

p类型在public_api.h中是
typedef
-ed,还有一些创建、修改和销毁它的函数,例如下面代码段中的
createP

但是,它的实现基于一个隐藏类型。隐藏,因为它是在源代码中定义的,通常作为已编译的二进制文件提供,可以安装。每个这样的操作都依赖于指针类型转换

我的用例简化如下:

#包括
使用std::cerr;
#包括
/*在**公共**api中定义*/
//_PUB_API_{{{
typedef结构P;
P*createP();
//}}}}{u发布API_
/*在**实现**文件中定义,编译为二进制*/
//HID_IMPL{{{
typedef结构P_up_;;
结构P_{};
P*createP(){return(P*)new P(();}
//}}}HID_IMPL
/***用例***/
int main(int argc,char*argv[])
{
P*P=createP();
if(p==NULL)
{/*不执行*/

cerr不使用库,您可以创建一个包装类,在其构造函数中分配指针,并在其析构函数中释放它,其中定义了一个强制转换运算符,通过强制转换可以轻松访问指针。这就是作用域指针所做的,而且实现起来相当简单

例如:

#include <iostream>

class ScopedCharPointer
{
public:
    ScopedCharPointer(size_t size);
    ~ScopedCharPointer();
    operator char *();
private:
    char *pointer;
};

ScopedCharPointer::ScopedCharPointer(size_t size) :
    pointer(new char[size])
{
}

ScopedCharPointer::~ScopedCharPointer()
{
    delete[] pointer;
}

ScopedCharPointer::operator char *()
{
    return pointer;
}

int
main(void)
{
    ScopedCharPointer example(100);
    char *pointer = static_cast<char *>(example);
    std::cout << static_cast<void *>(pointer) << std::endl;
    return 0;
}
#包括
类ScopedCharPointer
{
公众:
ScopedCharPointer(大小);
~ScopedCharPointer();
运算符char*();
私人:
字符*指针;
};
ScopedCharPointer::ScopedCharPointer(大小):
指针(新字符[大小])
{
}
ScopedCharPointer::~ScopedCharPointer()
{
删除[]指针;
}
ScopedCharPointer::运算符字符*()
{
返回指针;
}
int
主(空)
{
ScopedCharPointer示例(100);
char*pointer=static_cast(示例);

std::cout如果库还导出一个函数来销毁不透明类型,则此操作很简单。然后,您可以在智能指针的自定义删除程序中使用此函数

我在这里使用了
std::
智能指针,但原则也适用于
boost

例如:

// included from library:

struct Foo;
Foo* make_foo();
void destroy_foo(const Foo*);


// your code:

auto my_foo_ptr = std::shared_ptr<Foo>(make_foo(), &destroy_foo);


// or unique_ptr:

auto unique_foo = std::unique_ptr<Foo, void(*)(const Foo*)>(make_foo(),
                                                            &destroy_foo);
//从库中包括:
结构Foo;
Foo*make_Foo();
无效销毁(const foo);;
//您的代码:
auto my_foo_ptr=std::shared_ptr(make_foo(),&destroy_foo);
//或唯一\u ptr:
auto unique_foo=std::unique_ptr(make_foo(),
&销毁(u foo);;

您想要的术语是不透明的->基于隐藏类型,因为智能指针需要能够创建和删除对象,所以模板类型的构造函数和析构函数的声明需要visible@iharob谢谢你的术语,我将使用它并更新PostThank@Richards--它就像一个符咒。我应该在至少对库进行一次修改以找出答案。库确实提供了一个删除器,我已经编辑了上面的代码。再次感谢。@bvraghav很棒。自定义删除器经常被忽略:)这与我在建议pt.1时的感觉非常接近。非常感谢您的实现。实际上,如果我走到这一步,我更愿意使用declare将所有接受
OpaqueType*
作为第一个参数的函数作为
OpaqueWrapperType
的公共成员,并且根本没有指针实现。但这是我,不是所有人。
// included from library:

struct Foo;
Foo* make_foo();
void destroy_foo(const Foo*);


// your code:

auto my_foo_ptr = std::shared_ptr<Foo>(make_foo(), &destroy_foo);


// or unique_ptr:

auto unique_foo = std::unique_ptr<Foo, void(*)(const Foo*)>(make_foo(),
                                                            &destroy_foo);