Всем привет!
В общем есть вот такой код:
#include <boost/bind.hpp>
template <class T>
struct shift_f
{
T (*x)(const T&, const T&);
T (*y)(const T&, const T&);
shift_f <T> operator() (const shift_f<T>& a)
{
return {boost::bind(x, a.x, a.y), boost::bind(y, a.x, a.y)};
}
};
template <class T> T c2h_x (const T& x0, const T& y0)
{
T w=100;
return x0-w/2;
}
template <class T> T c2h_y (const T& x0, const T& y0)
{
T h=100;
return h/2-y0;
}
template <class T> shift_f<T> c2h={&c2h_x, &c2h_y};
Как его можно переделать в декорируемые классы, которые располагаются на стеке?
Хочется примерно такого (но все же видят косяк с operator()?):
template <class T> class shift_f
{
public:
virtual T x(const T&, const T&) =0;
virtual T y(const T&, const T&) =0;
shift_f<T> operator() (const shift_f & a)
{
template <class T>
class ret : public shift_f<T>
{
virtual T x(const T& x0, const T& y0) override
{
return x(a.x(x0, y0), a.y(x0,y0));
}
virtual T y(const T& x0, const T& y0) override
{
return x(a.x(x0, y0), a.y(x0,y0));
}
};
ret r;
return r;
}
};
template <class T>
class c2h : public shift_f<T>
{
virtual T x(const T& x0, const T& y0) override
{
T w=100;
return x0-w/2;
}
virtual T y(const T& x0, const T& y0) override
{
T h=100;
return h/2-y0;
}
};