在C ++中,我可以在不局部声明结构的情况下将其作为指针传递吗?

时间:2018-06-22 04:04:17

标签: c++ sdl

我正在使用SDL,它是一个C库,具有如下功能声明:

void SDL_foo(SDL_Rect *rect);

我对某些功能有自己的包装器:

void foo(SDL_Rect rect) {
  SDL_foo(&rect);
}

因此,我可以这样简单地称呼他们:

foo({x, y, w, h});

我的问题是:是否可以避免具有包装器功能并执行以下操作:

SDL_foo(&{x, y, w, h});

谢谢!

2 个答案:

答案 0 :(得分:9)

不,您不能这样做,因为您无法获得临时地址。
但是,您可以使用如下这样的包装器来摆脱它:

struct MyRect {
    MyRect(SDL_rect rect): rect{rect} {}
    operator SDL_rect *() { return ▭ }
    SDL_rect rect;
};

SDL_foo(MyRect{{x, y, w, h}});

尚未经过测试,但是它应该使您了解我的意思。
这样,您无需为SDL中的所有功能创建包装器,而只需在SDL_rect周围创建一个很小的包装器。
不确定它是否仍然适合您。

答案 1 :(得分:1)

tl; dr:只需使用引用即可。

如果包装程序使用引用,则可以完全避免问题,并获得所需的便捷调用约定-无需实例化任何不必要的结构副本。如果您不熟悉C ++,可以阅读StackOverflow这个问题,简要介绍一下它们: References in C++

无论如何,如果要包装的SDL函数具有签名:

void SDL_foo(SDL_Rect *rect);

那么您的包装器将是:

inline void my_wrapper_name(SDL_Rect& rect) {
    SDL_foo(&rect);
}

,即使SDL_Rect仅被向前声明,它仍然有效。

现在,如果您确定SDL_Rect将:

  1. 除了在调用SDL_foo()
  2. 中使用,
  3. 尽管未被指定为使用SDL_foo(),但未被const SDL_Rect*修改

您也可以写:

inline void my_wrapper_name(const SDL_Rect& rect) {
    SDL_foo(const_cast<SDL_Rect*>(&rect));
}

在这种情况下,您将可以在代码中的其他位置且实际定义为SDL_Rect来为SDL_Rect的初始化程序列表调用包装器。