LINUX.ORG.RU

С++ , шаблоны, помощь и поддержка

 ,


0

2

Господа,

Сижу, пишу на С++, никого не трогаю, однако же возникает чувство незнания языка, недопонимания возможностей, правил либо присутствие ограничений

К делу. https://gist.github.com/teyrnon/872c8f0cf07f6659992e - бессмысленная попытка посмотреть на compile-time вычисления на шаблонах, реализовать подобие fmap

tp<unsigned N, unsigned D>
struct frac_t {
    enum {
        n = N,
        d = D,
    };
};

tp<unsigned A> struct mult {
    tp<unsigned B> struct apply {
        enum { value = A * B, };
    };
};

tp< class Func, class Frac> struct fmap {

    tp<unsigned V>
    using apply_test = typename Func::apply<V>;

    using value = frac_t<
         Func::apply< Frac::n >::value,
         Func::apply< Frac::d >::value >;
};

std::cout << fmap< mult<2u>, frac_t<1u,2u> >::value();

Как поправить данную конструкцию?

*UPD* лог компилятора

g++ -c -pipe -std=c++11 -g -Wall -W -fPIE  -I../Monads -I. -I../../Qt/5.4/gcc_64/mkspecs/linux-g++ -o main.o ../Monads/main.cpp
../Monads/main.cpp:32:44: error: expected ';' before '<' token
     using apply_test = typename Func::apply<V>;
                                            ^
../Monads/main.cpp:32:44: error: expected unqualified-id before '<' token
../Monads/main.cpp:35:31: error: wrong number of template arguments (1, should be 2)
          Func::apply< Frac::n >::value,
                               ^
../Monads/main.cpp:7:8: error: provided for 'template<unsigned int N, unsigned int D> struct frac_t'
 struct frac_t {
        ^
../Monads/main.cpp: In instantiation of 'struct fmap<mult<2u>, frac_t<1u, 2u> >':
../Monads/main.cpp:44:49:   required from here
../Monads/main.cpp:32:44: error: 'typename mult<2u>::apply' names 'template<unsigned int B> struct mult<2u>::apply', which is not a type
     using apply_test = typename Func::apply<V>;
                                            ^
../Monads/main.cpp: In function 'int main(int, const char**)':
../Monads/main.cpp:44:18: error: 'value' is not a member of 'fmap<mult<2u>, frac_t<1u, 2u> >'
     std::cout << fmap< mult<2u>, frac_t<1u,2u> >::value();
                  ^
make: *** [main.o] Error 1


Последнее исправление: Kasha (всего исправлений: 2)

Сижу, пишу на С++, никого не трогаю, однако же возникает чувство незнания языка

это С++ детка, это нормально

ps/ просто к слову пришлось

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

Это еще и не-чтение стадарта, который я скорее всего никогда не открою..

Дальнейшее безумствование позволило объеденить функции в композицию и применять..

    using comp = composition<
        mult<frac_t<1,4>>,
        summ<frac_t<2,1>>
    >;
    EVAL ( fmap< comp, just<frac_t<1,3>> >::value    );
    EVAL ( fmap< comp, nothing >::value    );
fmap< comp, just<frac_t<1,3>> >::value 'Just 25 / 12'
fmap< comp, nothing >::value 'Nothing'
Kasha
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.