我重构我的 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_GLContext
是void*
的别名(或通常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);
}