#pragma warning (disable: 4786) #include #include #include #include #include using namespace std; using namespace xParam; template class abstract_testing { public: virtual const T& get_t(void) const=0; }; template class testing : public abstract_testing { private: T t; public: testing(const T& _t) : t(_t) {} const T& get_t(void) const { return t; } }; template class output_testing { public: static ValueList sub_objects(const testing& t) { ValueList vl; return vl << Val(t.get_t()); } }; class not_registered {}; template class abstract_testingRegCommand : public ClassRegCommand, AbstractClassKind > > { public: abstract_testingRegCommand(void) : ClassRegCommand, AbstractClassKind > >(typeid(T)) {} std::string type_name(void) const { return "abstract_testing<"+xparam_or_cpp_name(typeid(T))+">"; } }; template class testingRegCommand : public ClassRegCommand > { public: testingRegCommand(void) : ClassRegCommand >(typeid(T)) {} std::string type_name(void) const { return "testing<"+xparam_or_cpp_name(typeid(T))+">"; } }; template class param_testing { public: param_testing(void) { param_class >(new testingRegCommand()); param_abstract_class > (new abstract_testingRegCommand()); param_inheritance(DerivedTag >(), BaseTag >()); param_ctor(TypeTag >(),ConstRef("_t")); param_output,output_testing >(); } }; PARAM_BEGIN_REG /* This part was removed from the test, because it yields non-portable results. It should yield 5 pending registration calls: 1) param_testing 2) param_abstract_testing 3) param_testing inheritance from param_abstract_testing 4) param_testing(int) constructor 5) param_testing output param_testing(); */ param_testing(); PARAM_END_REG int main(int argc, char* argv[]) { xparam_init(); ParamSet ps; try { cout << "Testing template registration." << endl; char c; string s; vector vb; testing ti(7); ps << ioParamVar(c,"c") << ioParamVar(s,"s") << ioParamVar(vb,"vb") << ioParamVar(ti,"ti"); const char* input1[]={"test17","c=\'\\\'\' s=\"\\\"\" vb=[true, false]" "ti=8"}; ps.input(2,input1); ps.output(); } catch(Error e) { cout << "Unexpected error - " << endl << e.what() << endl; } try { cout << xparam_help(xparam_name(typeid(testing))) << endl; } catch(Error e) { cout << "Unexpected error - " << endl << e.what() << endl; } try { const char* input2[]={"test17","!","PENDING"}; ps.input(3,input2); } catch(Error e) { cout << "Unexpected error - " << endl << e.what() << endl; } return 0; }