#include <iostream>

using namespace std;

class base{
public:
    virtual int operator() ()
    {
        return 0;
    }
};

template <int n>
class num:public base{
public:
    int operator() ()
    {
        return n;
    }
};

template <int _b>
class add:public base{
    base * _a;
public:
    add(base * a)
    {
        _a = a;
    }
    int operator() ()
    {
        return (*_a)()+_b;
    }
};

class s{
    char _t[10];
    public:
    s()
    {
        _t = {'h','e','l','l','o'};
    }
    char operator[] (int i)
    {
        if (i<10)
            return _t[i];
        return 0;
    }
};

int main()
{
    cout << "test\n";
    base zero;
    cout << zero() << endl;
    num<1>un;
    cout << un() << endl;
    base * huh = &un;
    cout << (*huh)() << endl;
    add<2>whoa(&un);
    cout << whoa() << endl;
    
    s h;
    cout << h[0] << endl;
    
    return 0;
}
