我重构了我的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括号中写的正确的东西(在上面的代码中为空)。
typedef struct SDL_Window SDL_Window;
typedef void *SDL_GLContext;
我真的希望它与shared_ptr<SDL_Window>
具有相同的形式,但是由于SDL_GLContext
是指针类型,因此是不可能的。您可以看到我所做的是将void用作类型,但是如果我希望该类型可见,如何将指针类型的“级别”更改为非指针类型?我知道如何对变量进行操作,但是如何对类型进行操作?
答案 0 :(得分:1)
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 deleted\n"; }));
foo(ptr);
}
答案 1 :(得分:0)
您可能正在寻找
std::remove_pointer<SDL_GLContext>::type
如果SDL_GLContext
是void*
的别名(或者通常是T*
是T
的别名),那么上面的构造是void
的别名(或通常为T
)。