降低指针类型,以便与shared_ptr一起使用

时间:2018-09-06 13:25:25

标签: c++ c++11 syntax 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括号中写的正确的东西(在上面的代码中为空)。

typedef struct SDL_Window SDL_Window;
typedef void *SDL_GLContext;

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

2 个答案:

答案 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_GLContextvoid*的别名(或者通常是T*T的别名),那么上面的构造是void的别名(或通常为T)。