#include <stdio.h>

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