#include <iostream> #include <stddef.h> template <typename CountedType> class ObjectCounter { private: static size_t count; // number of existing objects protected: // default constructor ObjectCounter() { ++count; } // copy constructor ObjectCounter (ObjectCounter<CountedType> const&) { ++count; } // destructor ~ObjectCounter() { --count; } public: // return number of existing objects: static size_t live() { return count; } }; // initialize counter with zero template <typename CountedType> size_t ObjectCounter<CountedType>::count = 0; template <typename CharT> class MyString : public ObjectCounter<MyString<CharT> > { //... }; int main() { MyString<char> s1, s2; MyString<wchar_t> ws; std::cout << "number of MyString<char>: " << MyString<char>::live() << std::endl; std::cout << "number of MyString<wchar_t>: " << ws.live() << std::endl; }