クラステンプレート

#include <iostream>
using namespace std;

struct point {
    int x;
    int y;
};
template<typename T>class base
{    private:
        T data;
    public:
        base(T);
        void set_data(T);
        T get_data();
};

template<typename T> base<T>::base(T d)
{
    data = d;
}

template<typename T> void base<T>::set_data(T d)
{    data = d;
}

template<typename T> T base<T>::get_data()
{
    return data;
}

int main()
{
    base<int> a(10);
    base<string> b("hoge");
    base<double> c(1.2);
    base<char *> d("fuga");
    base<bool> e(true);

    point f0 = {1, 2}; 
    base<point> f(f0);

    cout << a.get_data() << endl;
    cout << b.get_data() << endl;
    cout << c.get_data() << endl;
    cout << d.get_data() << endl;
    cout << e.get_data() << endl;
    cout << f.get_data().x << "," << f.get_data().y << endl;

    return 0;
}
10
hoge
1.2
fuga
1
1,2

必ずその「型」がテンプレートになってしまう点がやっぱりあれだな、などとも思いつつ。
というのは、例えば、

// point のときだけ、こうしたい
f.set_data(1, 2);

とかね。メソッドの引数とかからして挙動を変えたい場合。この場合はクラスそのものを特殊化しなければいけないのだろうか。メソッドの特殊化でできるのかな?とも思ったんだけど、引数とかが宣言とかわってくるとテンプレートにあてはめられないじゃん?とか思った。どうするんだろうこういう場合。