#include <iostream>
 
class IA
{
public:
    virtual void start() = 0;
};
 
template <int i> class B : public IA
{
 
private:
 
    static B* m_This;
 
public:
 
    B()
    {
        m_This = this;
    }
 
    virtual void start()
    {
        std::cout << "start at instance: " << m_This << std::endl;
    }
 
    static void callback()
    {
        std::cout << "callback " << &callback << " at instance: " << m_This << std::endl;
        return;
    }
};
 
B<0>* B<0>::m_This;
B<1>* B<1>::m_This;
B<2>* B<2>::m_This;
B<3>* B<3>::m_This;
 
int main()
{
    IA* k[4];
 
    k[0] = new B<0>();
    k[1] = new B<1>();
    k[2] = new B<2>();
    k[3] = new B<3>();
 
    for( int x=0; x<4; x++)
        k[x]->start();
   
    // diese Aufrufe würden vom Treiber des Herstellers kommen
    B<0>::callback();
    B<1>::callback();
    B<2>::callback();
    B<3>::callback();
 
    return 0;
}