Здравствуйте, 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
)
);