Выше приведенный код прекрастно компилируется...
Но давайте изменим тип downloadObservers на DownloadObservers ...
Как теперь заставить его работать? Пишет ошибку:
c:\Agile\libr\boost\include\boost-1_33_1\boost\lambda\detail\actions.hpp(96): error C2665: 'boost::lambda::function_adaptor<Func>::apply' : none of the 2 overloads can convert parameter 2 from type 'std::allocator<_Ty>::value_type'
with
[
Func=boost::lambda::return_type_N<boost::lambda::function_action<3>,boost::lambda::lambda_functor_base<boost::lambda::action<3,boost::lambda::function_action<3>>,boost::tuples::tuple<const boost::lambda::detail::bind_traits<void (__thiscall IDownloaderObserver::* const )(const CString &)>::type,const boost::lambda::detail::bind_traits<const boost::lambda::placeholder1_type>::type,const boost::lambda::detail::bind_traits<const CString>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type>>::sig<boost::tuples::tuple<std::allocator<IDownloaderObserverPtr>::value_type &,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>::rets_t>::plain_Func
]
and
[
_Ty=IDownloaderObserverPtr
]
AI>Выше приведенный код прекрастно компилируется... AI>Но давайте изменим тип downloadObservers на DownloadObservers ...
во-первых для таких простых вещей lambda не нужна... достаточно просто boost::bind (не путать с boost::lambda::bind)
во-вторых DownloadObservers это не тоже самое что vector<IDownloaderObserver*>? чуйствуешь разницу?
хинт: в первом случае в векторе лежат _не_указатели_ а _объекты_ shared_ptr из которых еще надо достать указатель и только после этого вызывать евоный OnComplete! т.е. буит както так:
Здравствуйте, zaufi, Вы писали:
Z>хинт: в первом случае в векторе лежат _не_указатели_ а _объекты_ shared_ptr из которых еще надо достать указатель и только после этого вызывать евоный OnComplete!
А разве bind сам этого не умеет делать?
Здравствуйте, shank, Вы писали:
S>Здравствуйте, zaufi, Вы писали:
Z>>хинт: в первом случае в векторе лежат _не_указатели_ а _объекты_ shared_ptr из которых еще надо достать указатель и только после этого вызывать евоный OnComplete! S>А разве bind сам этого не умеет делать?
а как ты се это преставляешь??
г-н AgIle пытаица заbindить метод IDownloaderObserver'a а for_each упорно пихает в функтор объекты shared_ptr<IDownloaderObserver> -- дело тут совершенно не в bind'e -- товарисча грязно обругивает несогласный (обоснованно) компилятор (который не может вызвать IDownloaderObserver::OnCompleted у shared_ptr'a и пребывает в растерянности от беспардонных действий юзера )
Здравствуйте, zaufi, Вы писали:
Z>Здравствуйте, shank, Вы писали:
S>>Здравствуйте, zaufi, Вы писали:
Z>>>хинт: в первом случае в векторе лежат _не_указатели_ а _объекты_ shared_ptr из которых еще надо достать указатель и только после этого вызывать евоный OnComplete! S>>А разве bind сам этого не умеет делать?
Z>а как ты се это преставляешь??
Я многое в бусте плохо себе представляю. Z>г-н AgIle пытаица заbindить метод IDownloaderObserver'a а for_each упорно пихает в функтор объекты shared_ptr<IDownloaderObserver> -- дело тут совершенно не в bind'e -- товарисча грязно обругивает несогласный (обоснованно) компилятор (который не может вызвать IDownloaderObserver::OnCompleted у shared_ptr'a и пребывает в растерянности от беспардонных действий юзера )
Но так ведь работает
#include <iostream>
#include <algorithm>
#include <vector>
#include <boost/shared_ptr.hpp>
#include <boost/bind.hpp>
class A
{
public:
virtual void memfn() = 0;
};
class B : public A
{
int i_;
public:
B(int i = 0):i_(i){}
void memfn() { std::cout << "B::memfn() " << i_ << '\n'; }
};
typedef boost::shared_ptr<A> sptr;
int main()
{
std::vector<sptr> v;
v.push_back(sptr(new B(1)));
v.push_back(sptr(new B(3)));
v.push_back(sptr(new B(5)));
v.push_back(sptr(new B(7)));
v.push_back(sptr(new B(9)));
std::for_each(v.begin(), v.end(), bind(&A::memfn, _1));
}
Здравствуйте, zaufi, Вы писали:
Z>Здравствуйте, shank, Вы писали:
S>>Здравствуйте, zaufi, Вы писали:
Z>>>хинт: в первом случае в векторе лежат _не_указатели_ а _объекты_ shared_ptr из которых еще надо достать указатель и только после этого вызывать евоный OnComplete! S>>А разве bind сам этого не умеет делать?
Z>а как ты се это преставляешь??
Z>г-н AgIle пытаица заbindить метод IDownloaderObserver'a а for_each упорно пихает в функтор объекты shared_ptr<IDownloaderObserver> -- дело тут совершенно не в bind'e -- товарисча грязно обругивает несогласный (обоснованно) компилятор (который не может вызвать IDownloaderObserver::OnCompleted у shared_ptr'a и пребывает в растерянности от беспардонных действий юзера )
Можно посмотреть как сделать boost/multi_index/mem_fun.hpp для поддержки Chained Pointers.
It's kind of fun to do the impossible (Walt Disney)
Здравствуйте, Alex Alexandrov, Вы писали:
AA>Здравствуйте, zaufi, Вы писали:
Z>>Здравствуйте, shank, Вы писали:
S>>>Здравствуйте, zaufi, Вы писали:
Z>>>>хинт: в первом случае в векторе лежат _не_указатели_ а _объекты_ shared_ptr из которых еще надо достать указатель и только после этого вызывать евоный OnComplete! S>>>А разве bind сам этого не умеет делать?
Z>>а как ты се это преставляешь??
Z>>г-н AgIle пытаица заbindить метод IDownloaderObserver'a а for_each упорно пихает в функтор объекты shared_ptr<IDownloaderObserver> -- дело тут совершенно не в bind'e -- товарисча грязно обругивает несогласный (обоснованно) компилятор (который не может вызвать IDownloaderObserver::OnCompleted у shared_ptr'a и пребывает в растерянности от беспардонных действий юзера )
AA>Можно посмотреть как сделать boost/multi_index/mem_fun.hpp для поддержки Chained Pointers.
Имелось в виду — как сделано в Multi Index. Там экстрактор ключа автоматически применяет -> сколько надо раз.
It's kind of fun to do the impossible (Walt Disney)