#include <stdio.h>


class TraitsBase{
protected:
    

    typedef void (TraitsBase::*fptr)();
    fptr ptr;
    TraitsBase(fptr p) : ptr(p){}
public:
    void func1(){
        printf("func1\n");
    }
    void func2(){
        printf("func2\n");
    }
    
    void call(){
        (this->*ptr)();
    }
};
template<class T> class Traits;
template<> class Traits<int> : public TraitsBase{
public:
    Traits<int>() : TraitsBase(&TraitsBase::func1){};
    
};
template<> class Traits<float>: public TraitsBase{
public:
    Traits<float>() : TraitsBase(&TraitsBase::func2){}
};
int main(){
    Traits<int> i;
    i.call();
    Traits<float> f;
    f.call();
    
}