Sunday, 15 January 2012

c++ - member template instanciation -



c++ - member template instanciation -

i have bunch of classes inheriting same base of operations class. i'd register them in classregistry holds map of [name=>factoryforthisclass].

to had thought it's not working , don't understand why:

#include <typeinfo> #include <string> #include <map> #include <iostream> template< typename t > class declare_type { static int n; }; struct genericclassfactory { ~genericclassfactory() {}; virtual void* create( const std::string& rstrclassname ) = 0; }; template <typename t> struct classfactory : public genericclassfactory { virtual void* create( const std::string& rstrclassname ) { homecoming new t(); } }; class classregister { public: virtual ~classregister() { } template< typename t > static int declare( const std::string& rstrclassname = typeid(t).name() ) { std::cout << "classregister::declare( " << rstrclassname << " )\n"; homecoming 42; } static void create( const std::string& rstrclassname ) { std::cout << "classregister::create( " << rstrclassname << " )\n"; } private: }; template< typename t > int declare_type<t>::n = classregister::declare<t>(); template< typename t > class baseclass { declare_type<t> m_declaration; }; class someclass : public baseclass<someclass> { public: void meow(); }; //template class declare_type<someclass>; int main( void ) { classregister::create( "9someclass" ); homecoming 0; }

in understanding, having someclass inheriting baseclass<someclass> instanciates declare_type<someclass> doesn't ... note work if add:

template class declare_type<someclass>;

in case don't need fellow member in baseclass, lot less "magic" there 1 such line write each class declare ....

p.s: clear "it doesn't work" means classregister::declare() never called, opposed "it works" meaning classregister::declare() called before main , can utilize classregistry properly.

p.s.2: ok: http://ideone.com/af49pb ko: http://ideone.com/zmssjw, diff line 66

you explicitly instantiate declare_type<someclass>, means absolutely nil declare_type<someclass>::n. not used, , not instantiated.

if want instantiated, need utilize it, straight or indirectly, non-template code.

int doit = declare_type<someclass>::n;

(you need create n public of course).

c++ templates

No comments:

Post a Comment