, . / .
:
#include <string>
#include <iostream>
#include <typeinfo>
template<typename T> struct traits;
template<typename wrappedClass>
struct self_registering {
self_registering() {};
virtual ~self_registering() {};
static bool isRegistered() { return registered; }
private:
typedef traits<wrappedClass> WrappedClass_;
static bool doRegistration() {
std::cout << "Default-registering " << WrappedClass_().code() << '\n';
return true;
};
static const bool registered;
};
template<typename T>
const bool self_registering<T>::registered
= self_registering<T>::WrappedClass_().doRegistration();
template<typename T>
struct traits : self_registering<T> {
static std::string code() { return typeid(T).name(); };
};
class A {}; class B {}; class C {}; class D {};
class E {}; class F {}; class G {}; class H {};
template<> struct traits<H> : self_registering<H> {
static std::string code() { return "class H"; }
bool doRegistration() {
std::cout << "Private-registering " << code() << "\n";
return true;
};
};
template<typename T>
void printMe() {
static bool isRegistered = traits<T>::isRegistered();
(void)isRegistered;
std::cout << "Printing " << traits<T>::code() << '\n';
}
int main(void)
{
printMe<B>();
printMe<B>();
printMe<C>();
printMe<H>();
return 0;
}
, static, - - ( - , RegisterClass(), ..).
, - registered printMe(), ( , registration()). static bool, .
, ++ 11 (, , , pre-++ 11). , , - registered - .
/ VS2012 :
C:\tmp>cl /nologo /EHsc /W4 so-misc.cpp
so-misc.cpp
C:\tmp>so-misc
Default-registering class B
Default-registering class C
Private-registering class H
Printing class B
Printing class B
Printing class C
Printing class H
gcc 4.7.2 as:
$ gcc -std=c++11 -lstdc++ -Wall -pedantic so-misc.cpp
$ ./a.out | c++filt -t
Default-registering B
Default-registering C
Private-registering class H
Printing B
Printing B
Printing C
Printing class H
Obviously, you can do other actions (hereinafter template-ize self-registeringto make the wrapper class more general than traitssome cleaning, etc.), but this may work for you as a start.
source
share