std::unique_ptr和shared_ptr的bool类型判断,是怎么做到的?
例如像下面这样:
#include<memory>using namespace std;int main(void){ unique_ptr<int> pi(new int); if(pi){ printf("has data\n"); } return 0;} _OPERATOR_BOOL() const { // test for non-null pointer return (this->_Myptr != pointer() ? _CONVERTIBLE_TO_TRUE : 0); }#define _OPERATOR_BOOL operator _STD _Bool_typetypedef int _Bool_struct::* _Bool_type;struct _Bool_struct { // define member just for its address int _Member; };explicit operator bool() const noexcept{ return get() == pointer() ? false : true; }
[解决办法]
一般是
operator void*
[解决办法]
VC 编译器, 很落后。
为什么还要用vc呢?
太执着了。
免费的 gcc ,
收费的 intel c++,
无论是性能,还是对语言标准的支持,都胜过 vc 编译器。
告别vc,才能使用真正的c++
[解决办法]
VC 2010,
对于C, 至今不支持C99
对于C++0x, 只支持极少的一部分
对于openMP,貌似还是2.0这种上古版本
对于CPU特性, 也只支持arch:sse2
告别VC吧,微软早就把重心转到 .net之类的去了
[解决办法]
(1) _OPERATOR_BOOL 被定义成了一个函数指针, 在 xstddef 里可以找到如下的定义:
typedef void (*_Bool_type)(const _Bool_struct&);
之所以定义一个这种指针主要是为了避免副作用, 比如你直接定义成 bool 或 int 或 void* 之类的话可能造成 int x = pi; 这种也通过编译了.
一个复杂的函数指针即可以用于做逻辑比较, 又能避免向常见类型的转换.
[解决办法]
(2) 和 pointer() 比较可以保证两个指针的类型是匹配的, nullptr 是一个什么类型? int? void* ?
[解决办法]
(3) _CONVERTIBLE_TO_TRUE 也是一个函数指针:
#define _CONVERTIBLE_TO_TRUE(&_STD _Bool_function)
inline void _Bool_function(const _Bool_struct&)
{// do nothing
}
你说的 #define _CONVERTIBLE_TO_TRUE(&_STD _Bool_struct::_Member) 是一个结构体的数据成员指针, 这是另外一个版本, 它对应着的 _Bool_type 也是一个结构体的数据成员指针:
typedef int _Bool_struct::* _Bool_type;