我正在学习 Cinder 框架。这个框架中有一个类Texture
,可以这样使用:
Texture myImage;
myImage.loadImage(/*...*/);
if(myImage)
{
// draw the image.
}
我对此感到困惑,因为myImage
它是一个对象。将其用作条件对我来说没有意义。我期待类似的东西myImage.exist();
。所以我单步执行了代码,结果发现Texture
该类定义了一个转换运算符:
public:
//@{
//! Emulates shared_ptr-like behavior
typedef std::shared_ptr<Obj> Texture::*unspecified_bool_type;
// What is this???
operator unspecified_bool_type() const { return ( mObj.get() == 0 ) ? 0 : &Texture::mObj; }
void reset() { mObj.reset(); }
//@}
对象定义为:
protected:
struct Obj {
Obj() : mWidth( -1 ), mHeight( -1 ), mCleanWidth( -1 ), mCleanHeight( -1 ), mInternalFormat( -1 ), mTextureID( 0 ), mFlipped( false ), mDeallocatorFunc( 0 ) {}
Obj( int aWidth, int aHeight ) : mInternalFormat( -1 ), mWidth( aWidth ), mHeight( aHeight ), mCleanWidth( aWidth ), mCleanHeight( aHeight ), mFlipped( false ), mTextureID( 0 ), mDeallocatorFunc( 0 ) {}
~Obj();
mutable GLint mWidth, mHeight, mCleanWidth, mCleanHeight;
float mMaxU, mMaxV;
mutable GLint mInternalFormat;
GLenum mTarget;
GLuint mTextureID;
bool mDoNotDispose;
bool mFlipped;
void (*mDeallocatorFunc)(void *refcon);
void *mDeallocatorRefcon;
};
std::shared_ptr<Obj> mObj;
我知道这operator int() const
可以隐式地将 Object 更改为 int,但是 unspecified_bool_type 是如何工作的?调试器在执行operator unspecified_bool_type() const { return ( mObj.get() == 0 ) ? 0 : &Texture::mObj; }
时停止if(myImage)
。
我可能对这里的语法有点困惑,什么
typedef std::shared_ptr<Obj> Texture::*unspecified_bool_type;
意思是?
并且确实
void (*mDeallocatorFunc)(void *refcon);
在 Obj 中意味着 mDeallocatorFunc 是 Class Obj 的成员,一个指向具有原型的函数的函数指针:void xxx(void *)
?