作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有包装类来包装 C 库。在本例中为 SDL。我会将所有内容缩短到必要的细节,如果有遗漏,请在评论中告诉我。
例如,我有一个名为 texture_t
的类,它将包装 SDL_Texture
class texture_t
{
public:
...
private:
SDL_Texture *tex;
}
有时,它可能在shared_ptr
中:
typedef std::shared_ptr<texture_t> texture_ptr_t;
现在,如果我想调用一个以 SDL_Texture *
作为参数的 SDL
函数,我需要我的 texture_t
和 texture_ptr_t
隐式转换为它。
我尝试在我的类(class)中实现这些运算符:
operator SDL_Texture *(void);
operator const SDL_Texture *(void) const;
但我仍然收到 no viable conversion from texture_ptr_t to SDL_Texture *
错误。有人可以为我指明正确的方向吗?
最佳答案
即使没有使用原始指针的 shared_ptr
,您也会遇到这些错误,所以我暂时放弃它。
隐式转换仅适用于 texture_t
对象,不适用于指向对象(智能或其他)的指针。它不起作用,因为 shared_ptr
和哑指针都没有转换为不相关的指针类型。
因此,要调用任何 SDL_func
并启动转换,您需要为 texture_t
提供一个 glvalue(引用)。这很容易通过取消引用来完成。
SDL_func(*ptr, /* other args */); // ptr can be a dumb pointer too.
但是说了这么多,这感觉像是一个有漏洞的抽象。如果您努力包装 SDL_Texture*
,请不要半途而废。让 texture_t
成为一个完全值语义类型,在 SDL 库上提供抽象的操作。不要因为知道您使用的是什么库而为调用代码增加负担。如果以后需要的话,这将使切换库变得更加容易。
关于c++ - std::shared_ptr 到指针类型的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56091228/
我是一名优秀的程序员,十分优秀!