LINUX.ORG.RU

как развернуть декоратор во время компиляции в С++?

 , ,


1

5

Всем привет!

В общем есть вот такой код:

#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;
    }
};
★★

Хочется именно такую структуру кода, так как потом будет удобно задавать целый набор преобразований прямо на ходу (код примерный):

//generate transformation
auto s=h2c(rotate(warp<10,15>(c2h)));
//use transform
auto new_x=s.x(old_x, old_y);
auto new_y=s.y(old_x, old_y);
aido ★★ ()
Ответ на: комментарий от aido

Все-таки было бы лучше постановку задачи описать словами, а не кодом из которого таки не понятно, что же хотел сказать автор.

eao197 ★★★★★ ()
Ответ на: комментарий от eao197

Есть класс преобразований, которые хочется компоновать между собой в разном порядке, а после компоновки запускать расчет.

aido ★★ ()
Ответ на: комментарий от aido

Понятнее не стало ни на грамм.

Например, почему бы не сделать так:

template<typename T, template<class> I>
struct shift_f : public I<T> {};

template<typename T>
struct c2h_t {
  T x(const T& x0, const T& y0)
  {
    T w=100;
    return x0-w/2;
  }
  T y(const T& x0, const T& y0)
  {
    T h=100;
    return h/2-y0;
  }
};

template<typename T>
using c2h = shift_t<T, c2h_t>;
eao197 ★★★★★ ()
Ответ на: комментарий от aido

Есть класс преобразований, которые хочется компоновать между собой в разном порядке, а после компоновки запускать расчет.

вам хочется lisp, но вы этого ещё не осознали.. :-)

MKuznetsov ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.