Re[5]: Получить сигнатуру из ламбды
От: YuriV  
Дата: 13.08.20 09:24
Оценка:
Здравствуйте, Barbar1an, Вы писали:

B>Здравствуйте, YuriV, Вы писали:


YV>>Во-первых праметер-пак(class ...L) не нужен.


B>точно, это я перестарался


YV>>Что ожидает в качестве темплейт-параметра CActiveDelegate?


B>вообще там долден быть пак аргументов, но я поменял всё на сигнатуру


B>
B>    template<typename S> struct CActiveDelegate
B>    {
B>        fastdelegate::FastDelegate<S>    Function;
B>        std::function<S>        Lambda;
B>        int                Listen;

B>        CActiveDelegate()
B>        {
B>        }
B>    };

B>    template<class X, class Y, typename...A> auto CreateActiveDelegate(Y* x, void (X::*func)(A...), int l)
B>    { 
B>        CActiveDelegate<void(A...)> d;
B>        d.Function = fastdelegate::FastDelegate<void(A...)>(x, func);
B>        d.Listen = l;
B>        return d;
B>    }


B>    template<class L> auto CreateLambdaDelegate(L la, int l)
B>    { 
B>        CActiveDelegate<typename fn::traits<L>::signature> d;
B>        d.Lambda = la;
B>        d.Listen = l;
B>        return d;
B>    }

B>    #define FunctionSubscriber(method, l)    CreateActiveDelegate(this, &std::remove_pointer<decltype(this)>::type::method, l)
B>    #define LambdaSubscriber(la, l)            CreateLambdaDelegate(la, l)

B>    template<class ...A> class CActiveEvent
B>    {
B>        public:
B>            void operator += (CActiveDelegate<void(A...)> & d)
B>            {
B>                Subscribers.push_back(d);
B>            }

B>        protected:
B>            std::list<CActiveDelegate<void(A...)>>    Subscribers;
B>    };


B>    class A
B>    {
B>        void AAA(std::string &)
B>        {
B>            CActiveEvent<std::string &> aaa;

B>            aaa += FunctionSubscriber(AAA, 1);
B>            aaa += LambdaSubscriber([](std::string &){}, 2);

B>        }
B>    };
B>


B>и все равно не проходит


1>>CActiveDelegate<void (__thiscall A::AAA::<lambda_65ea410b267bfdbc362c6e23c2be9649>::* )(std::string &) const>::Function' uses undefined class 'fastdelegate::FastDelegate<S>'

1>> with
1>> [
1>> S=void (__thiscall A::AAA::<lambda_65ea410b267bfdbc362c6e23c2be9649>::* )(std::string &) const
1>> ]

B>например потому что у нас сигнратура const какого-то хрена


Так компайлер ругается на fastdelegate, а не на CreateLambdaDelegate. Зачем тебе разделять лямбды и обычные функции/методы? Пихай всё в fastdelegate/std::function. Проверь код fastdelegate, там нет к-тора для const функторов видимо. Если нельзя добавить, то сними const std::remove_const/std::remove_cv. Последнее снимает и volatile qualifier. Попробуй закомментировать
aaa += FunctionSubscriber(AAA, 1);
и скомпилить. Я этим кодом пользуюсь лет 6 наверное.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.