现在越来越懒了,虽然积累的知识越来越多,但写出来的东西越来越少。
趁还有点心情,把刚看的关于safe bool的东西写到这里:
相关url: http://www.artima.com/cppsource/safeboolP.html
这页面上的code有问题,经过调试,并借鉴了一部分http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool里面提到的东西,整理了一份可以编译的code:
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <set>
using namespace std;
class safe_bool_base {
protected:
void this_type_does_not_support_comparisons() const {}
typedef void (safe_bool_base::*bool_type)() const;
safe_bool_base() {}
safe_bool_base(const safe_bool_base&) {}
safe_bool_base& operator=(const safe_bool_base&) {return *this;}
~safe_bool_base() {}
};
template <typename T=void> class safe_bool : private safe_bool_base {
public:
operator bool_type() const {
return (static_cast<const T*>(this))->boolean_test() ? &safe_bool<T>::this_type_does_not_support_comparisons : 0;
}
protected:
~safe_bool() {}
};
template<> class safe_bool<void> : private safe_bool_base {
public:
operator bool_type() const {
return boolean_test()==true ? &safe_bool<void>::this_type_does_not_support_comparisons : 0;
}
protected:
virtual bool boolean_test() const=0;
virtual ~safe_bool() {}
};
template <typename T>
bool operator==(const safe_bool<T>& lhs, bool b) {
return (lhs) ? b : !b;
}
template <typename T>
bool operator==(bool b, const safe_bool<T>& rhs) {
return (rhs) ? b : !b;
}
template <typename T, typename U>
void operator==(const safe_bool<T>& lhs,const safe_bool<U>& rhs) {
lhs.this_type_does_not_support_comparisons();
return false;
}
template <typename T,typename U>
void operator!=(const safe_bool<T>& lhs,const safe_bool<U>& rhs) {
lhs.this_type_does_not_support_comparisons();
return false;
}
class Testable_with_virtual : public safe_bool<> {
protected:
bool boolean_test() const {
// Perform Boolean logic here
return true;
}
};
#if (1)
class Testable_without_virtual :
public safe_bool <Testable_without_virtual> {
public:
bool boolean_test() const {
// Perform Boolean logic here
return true;
}
};
#else
class Testable_without_virtual :
private safe_bool <Testable_without_virtual> {
template <typename T> friend class safe_bool;
public:
using safe_bool<Testable_without_virtual>::operator bool_type;
bool boolean_test() const {
return true; // Logic goes here!
}
};
#endif
int main(int argc, char* argv[])
{
Testable_without_virtual t;
if (t) {
cout << "OK" << endl;
} else {
cout << "FAIL" << endl;
}
Testable_with_virtual t2;
if (t2 == true && true == t2) {
cout << "OK" << endl;
} else {
cout << "FAIL" << endl;
}
return 0;
}
当然,上面的代码里有很多技巧,不光是safe bool idiom,对于平日里写代码时,值得借鉴的是:
class A {
typedef void* A::*unspecified_bool_type;
public:
/* //别再写这这样的conversion了,用下面的那个
operator bool() const {
return _pointer ? true : false;
}
*/
operator unspecified_bool_type() const {
return _pointer ? &A::_pointer : NULL;
}
private:
void* _pointer;
};