/* try.cpp - for trying out some language features.... * scons will create the binary bin/try * */ // 8/07 - how to control NOBUG?? // execute with NOBUG_LOG='ttt:TRACE' bin/try // 1/08 - working out a static initialisation problem for Visitor (Tag creation) // 1/08 - check 64bit longs // 4/08 - comparison operators on shared_ptr // 4/08 - conversions on the value_type used for boost::any // 5/08 - how to guard a downcasting access, so it is compiled in only if the involved types are convertible // 7/08 - combining partial specialisation and subclasses // 10/8 - abusing the STL containers to hold noncopyable values // 6/09 - investigating how to build a mixin template providing an operator bool() // 12/9 - tracking down a strange "warning: type qualifiers ignored on function return type" // 1/10 - can we determine at compile time the presence of a certain function (for duck-typing)? //#include //#define LUMIERA_LOGGING_CXX //#include "include/logging.h" //#include "include/nobugcfg.h" #include //#include #include #include #include //using std::rand; using std::string; using std::cout; using std::endl; struct A { int& funA (); }; struct B { void funA(); }; typedef char Yes_t; struct No_t { char padding[8]; }; template class Detector1 { template struct Probe { }; template static Yes_t check(Probe*); template static No_t check(...); public: static const bool value = (sizeof(Yes_t)==sizeof(check(0))); }; template class Detector2 { template struct Probe { }; template static Yes_t check(Probe*); template static No_t check(...); public: static const bool value = (sizeof(Yes_t)==sizeof(check(0))); }; int main (int, char**) { // NOBUG_INIT; cout << "Detector1 = " << Detector1::value << endl; cout << "Detector1 = " << Detector1::value << endl; cout << "Detector2 = " << Detector2::value << endl; cout << "Detector2 = " << Detector2::value << endl; cout << "\n.gulp.\n"; return 0; }