Re: Варим кашу в буст - lambda + bind + shared_ptr
От: zaufi Земля  
Дата: 29.08.06 11:37
Оценка: 2 (1)
Здравствуйте, AgIle, Вы писали:

AI>Всем привет!


AI>

AI>class IDownloaderObserver
AI>{
AI>public:
AI>    virtual void OnCompleted(CString const& fileName)    =0;
AI>};

AI>typedef shared_ptr<IDownloaderObserver> IDownloaderObserverPtr;

AI>typedef vector<IDownloaderObserverPtr> DownloadObservers;

AI>class DownloadSubject
AI>{
AI>public:
AI>    void registerObserver(IDownloaderObserverPtr observer);
AI>    void removeObserver(IDownloaderObserverPtr observer);

AI>protected:
AI>    void notifyCompleted(CString const& fileName);

AI>private:
AI>    /*DownloadObservers*/ vector<IDownloaderObserver*> downloadObservers;
AI>};

AI>void DownloadSubject::notifyCompleted(CString const& fileName)
AI>{
AI>    for_each(    downloadObservers.begin(),
AI>            downloadObservers.end(),
AI>            lambda::bind(&IDownloaderObserver::OnCompleted, lambda::_1, fileName)    );

AI>}

AI>


AI>Выше приведенный код прекрастно компилируется...

AI>Но давайте изменим тип downloadObservers на DownloadObservers ...

во-первых для таких простых вещей lambda не нужна... достаточно просто boost::bind (не путать с boost::lambda::bind)
во-вторых DownloadObservers это не тоже самое что vector<IDownloaderObserver*>? чуйствуешь разницу?

хинт: в первом случае в векторе лежат _не_указатели_ а _объекты_ shared_ptr из которых еще надо достать указатель и только после этого вызывать евоный OnComplete! т.е. буит както так:
using namespace boost;
for_each(
    downloadObservers.begin()
  , downloadObservers.end()
  , bind(
        &IDownloaderObserver::OnCompleted
      , bind(&DownloadObservers::value_type::get, _1)
      , fileName
      )
  );
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.