我正在使用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});
谢谢!
答案 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)
如果包装程序使用引用,则可以完全避免问题,并获得所需的便捷调用约定-无需实例化任何不必要的结构副本。如果您不熟悉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
将:
SDL_foo()
和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
的初始化程序列表调用包装器。