我遇到了一个包装boost::shared_ptr
的类,但我不太理解转换操作符是什么以及它的具体工作方式。该类如下:
class TestWrapper {
public:
explicit TestWrapper(int* ptr) : internal(ptr) {}
typedef boost::shared_ptr<int> TestWrapper::* safe_bool;
boost::shared_ptr<int> internal;
bool operator!() { return !internal; }
operator safe_bool() const { return internal ? &TestWrapper::internal : 0; }
};
该代码使得像下面这样的测试可以像测试包装指针的null
性一样工作:
TestWrapper t(new int(5));
if(!t) {
std::cout << "!null" << std::endl;
}
if(t) {
std::cout << "null" << std::endl;
}
然而,我无法理解typedef的含义:
typedef boost::shared_ptr<int> TestWrapper::* safe_bool;
它看起来不像是boost::shared_ptr
的重命名,也不像函数指针(需要括号?)。那这是什么?
我也无法弄清楚转换运算符的含义:
operator safe_bool() const { return internal ? &TestWrapper::internal : 0; }
&TestWrapper::internal
是什么?为什么它与typedef
相同类型?为什么0可以转换成它?
explicit operator bool()
,因此不再需要这个小技巧了。请查看https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool。 - tmlenoperator bool()
,因此if(t)
起作用。但是,operator bool()
也允许其他操作,例如将TestWrapper
隐式转换为int
。因此,使用数据成员指针类型safe_bool
,因为它可以在if
中使用,但不能进行其他任何操作(没有隐式转换、没有<
比较等)。 - tmlen