/* 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 #include #include #include #include using std::string; using std::cout; using std::ostream; using boost::format; #include using boost::enable_if; #include using boost::is_base_of; #include #include #include "common/typelistutil.hpp" using lumiera::typelist::NullType; using lumiera::typelist::Node; using lumiera::typelist::Types; namespace { boost::format fmt ("<%2i>"); /** constant-wrapper type for debugging purposes, * usable for generating lists of distinghishable types */ template struct Num { enum{ VAL=I }; static string str () { return boost::str (fmt % I); } Num() { cout << Num::str(); } }; template class _CandidateTemplate_> class Instantiation { template struct If_possibleArgument : _CandidateTemplate_ { typedef void Type; }; public: template struct Test : boost::false_type {}; template struct Test::Type > : boost::true_type {}; }; } struct Boing { typedef boost::true_type is_defined; }; template struct Zoing ; template<> struct Zoing<2> : Boing { enum{wau = 2}; }; template<> struct Zoing<5> : Boing { enum{wau = 5}; }; typedef char yes_type; struct no_type { char padding[8]; }; template yes_type check(typename U::is_defined *); template no_type check(...); int main (int argc, char* argv[]) { NOBUG_INIT; typedef Zoing<2> Z2; typedef Zoing<3> Z3; typedef Zoing<5> Z5; cout << sizeof(check(0)) << " / " << sizeof(check(0)) << " / " << sizeof(check(0)) ; cout << "\ngulp\n"; return 0; }