下步指针键入用于shared_ptr的级别



我重构我的 SDL2 代码以利用 C++11 的一些新功能,并让一些shared_ptr处理清理。然后我偶然发现了这个问题。现在我在创建 openGL 上下文时写这个。

auto window = shared_ptr<SDL_Window>(SDL_CreateWindow(
"Opengl stuff", 0, 0, width, height, windowFlags),
SDL_DestroyWindow);

auto context = shared_ptr<void>(
SDL_GL_CreateContext(window.get()),
SDL_GL_DeleteContext);

问题是当我想分配给变量上下文时,我找不到正确的东西写在shared_ptr的括号中(上面的代码中为 void(。

typedef struct SDL_Window SDL_Window;
typedef void *SDL_GLContext;

我真的希望它与shared_ptr<SDL_Window>的形式相同,但由于SDL_GLContext是指针类型,因此是不可能的。您可以看到我所做的是使用 void 作为类型,但是如果我希望该类型可见,如何将指针类型的"级别"更改为非指针类型?我知道如何为变量执行此操作,但是如何使用类型执行此操作?

您可能正在寻找

std::remove_pointer<SDL_GLContext>::type

如果SDL_GLContextvoid*的别名(或通常T*某些T的别名(,那么上面的构造是void(或通常T(的别名。

SDL 永久隐藏SDL_GL_CreateContext返回的对象的实际类型。指针面向未向您公开的特定于操作系统的上下文对象。

shared_ptr<void>是完全可以的.在后台shared_ptr执行类型擦除并存储删除程序[1]。

但是,由于它允许将任何类型的shared_ptr转换为shared_ptr<void>因此您可能希望确保它不会发生。要实现这一点,您可以像这样标记它:

#include <memory>
#include <iostream>
struct sdl_context_tag;
typedef void* SDL_GLContext;
void bar(SDL_GLContext)
{
}
void foo(std::shared_ptr<sdl_context_tag> context)
{
bar(context.get());
}
int main()
{
auto ptr = std::static_pointer_cast<sdl_context_tag>(std::shared_ptr<void>(new int, [](int * p){ delete p; std::cout << "int deletedn"; }));
foo(ptr);
}

最新更新