在 C++ 中,我可以将结构作为指针传递而不在本地声明它吗?
In C++ can I pass a structure as a pointer without declaring it locally?
我正在使用 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});
谢谢!
不,你不能这样做,因为你无法获得临时地址。
但是你可能可以用这样的包装器来摆脱它:
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
.
创建一个小包装器
不确定它是否适合您。
tl;dr:只需使用引用即可。
如果您的包装器使用 references,您可以完全避免您的问题,并获得您喜欢的方便的调用约定 - 无需实例化任何不必要的结构副本。如果您是 C++ 的新手,可以阅读这个 Whosebug 问题,其中简要介绍了它们: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
.
的初始化列表调用包装器
我正在使用 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});
谢谢!
不,你不能这样做,因为你无法获得临时地址。
但是你可能可以用这样的包装器来摆脱它:
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
.
创建一个小包装器
不确定它是否适合您。
tl;dr:只需使用引用即可。
如果您的包装器使用 references,您可以完全避免您的问题,并获得您喜欢的方便的调用约定 - 无需实例化任何不必要的结构副本。如果您是 C++ 的新手,可以阅读这个 Whosebug 问题,其中简要介绍了它们: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
.