template <class X, class Y>
class Comp_base {
public:
virtual Y operator()(X) const = 0;
virtual Comp_base* clone() const = 0;
virtual ~Comp_base() {}
};
template<class F, class G, class X, class Y>
class Comp : public Comp_base<X,Y> {
public:
Comp(F f0, G g0) : f(f0), g(g0) {}
Y operator()(X x) const { return f(g(x)); }
Comp_base<X,Y>* clone() const {
return new Comp(*this);
}
private:
F f;
G g;
};
template<class X, class Y>
class Composition {
public:
//declare template member function in a template class
template<class F, class G> Composition(F, G); //?
Composition(const Composition&);
Composition& operator=(const Composition&);
~Composition();
Y operator() (X) const;
private:
Comp_base<X, Y>* p;
};
//class Compositon Complimention:
// define template member function in a template class
template<class X, class Y>
template<class F, class G>
Composition<X,Y>::Composition(F f, G g) :
p(new Comp<F, G, X, Y> (f, g)) {}
template<class X, class Y>
Composition<X, Y>::~Composition() {
delete p;
}