Re[2]: Велосипед
От: jazzer Россия Skype: enerjazzer
Дата: 19.06.03 14:59
Оценка: +1
Здравствуйте, Alexander Shargin, Вы писали:

AS>в) Мне просто было интересно дойти до этого самому и получить удовольствие от процесса.


наш человек!
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: наследование операторов
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 20.06.03 03:29
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

[]

L_L>Ну что ж, давай пример


operator=
Re[5]: наследование операторов
От: Lorenzo_LAMAS  
Дата: 20.06.03 06:57
Оценка:
AS>operator=

Нет.

Он наследуется, но так как в производном классе компилятор неявно определяет оператор присваивания, то он hides оператор из базы.
Of course, the code must be complete enough to compile and link.
Re[6]: наследование операторов
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 20.06.03 09:17
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

[]

Другими словами — не наследуется.
Re[2]: Велосипед
От: eluka Швеция  
Дата: 05.08.03 10:10
Оценка: 1 (1)
Здравствуйте, MaximE, Вы писали:

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


WH>>Здравствуйте, Александр Шаргин, Вы писали:


WH>>сабж.

WH>>см boost\signal

ME>Еще есть Libsigc++, но она больно уж под Unix заточена.


А еще есть Sigslot. Она в отличии от boost::signal thread-safe.
Re[7]: наследование операторов
От: Аноним  
Дата: 28.08.03 12:21
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Другими словами — не наследуется.


Наследуется, но его имя скрыто.

Вот конструктор — тот не наследуется.
Re: Отчего boost такой вычурный?
От: Gregory Россия ICQ 300403361
Дата: 29.08.03 09:18
Оценка:
Здравствуйте, Александр Шаргин, Вы писали:

АШ>Статья :

АШ>Делегаты на C++

Прочитал статью. Заинтересовался идеей. Реализация, приводимая в статье, конечно оставляет желать лучшего, но дело не в этом.
В одном из постов по данной теме упоминался boost::signal. Скачал boost. Попробовал компильнуть тест для boost::signal посредством VC6 (VC7 пробовать не стал). VC6 сказал что у него INTERNAL COMPILER ERROR, и посоветовал обратиться куда следует. Обращаться не стал, искать баг в boost и в вижуале тоже (пусть это останеться на их совести). В boost нашел boost::function, тест для которого VC6 скомпилил. Для моих целей boost::function вполне бы подошел, т.к. мне не требуется одним махом вызывать кучу функций, но...
в этом собственно и состоит вопрос:

В процессе выяснения "зачем они тут так крепят" обнаружил что boost::function реализован очень вычурно. Если взять код из статьи и довести его до ума, или прописать нечто свое (что я и сделал), то можно получить теже самые результаты более простыми способами без алокаторов, итераторов, any_pointer, useless_clear_type и прочих наворотов. Зачем это все нужно? Для переносимости кода? По-моему это все равно, что оптический прицел к открывалке для пива приделать.

И еще один впрос. Если вызвать operator() делегата, который вызывает несколько функций, возвращающих скажем int, то что вернет оператор?
Не дай своим глазам увидеть, а ушам услышать то, что ты не сможешь объяснить.
Абрахам ван Хелсинг
Re[2]: Отчего boost такой вычурный?
От: MaximE Великобритания  
Дата: 29.08.03 10:03
Оценка:
Здравствуйте, Gregory, Вы писали:

[]

G>В процессе выяснения "зачем они тут так крепят" обнаружил что boost::function реализован очень вычурно. Если взять код из статьи и довести его до ума, или прописать нечто свое (что я и сделал), то можно получить теже самые результаты более простыми способами без алокаторов, итераторов, any_pointer, useless_clear_type и прочих наворотов. Зачем это все нужно? Для переносимости кода? По-моему это все равно, что оптический прицел к открывалке для пива приделать.


Признаюсь, статью на RSDN я не читал, только просмотрел.

boost::function<> может принимать не только укзатели на функции и на функции-члены, но и bind и labda выражения. Насколько я понял, CDelegate из статьи этого сделать не могут.

G>И еще один впрос. Если вызвать operator() делегата, который вызывает несколько функций, возвращающих скажем int, то что вернет оператор?


В доках boost::signals все подробно написано:

Signal Return Values (Advanced)
Just as slots can receive arguments, they can also return values. These values can then be returned back to the caller of the signal through a combiner. The combiner is a mechanism that can take the results of calling slots (there many be no results or a hundred; we don't know until the program runs) and coalesces them into a single result to be returned to the caller. The single result is often a simple function of the results of the slot calls: the result of the last slot call, the maximum value returned by any slot, or a container of all of the results are some possibilities.

Re[3]: Отчего boost такой вычурный?
От: MaximE Великобритания  
Дата: 29.08.03 10:09
Оценка:
Здравствуйте, MaximE, Вы писали:

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


ME>[]


G>>В процессе выяснения "зачем они тут так крепят" обнаружил что boost::function реализован очень вычурно. Если взять код из статьи и довести его до ума, или прописать нечто свое (что я и сделал), то можно получить теже самые результаты более простыми способами без алокаторов, итераторов, any_pointer, useless_clear_type и прочих наворотов. Зачем это все нужно? Для переносимости кода? По-моему это все равно, что оптический прицел к открывалке для пива приделать.


ME>Признаюсь, статью на RSDN я не читал, только просмотрел.


ME>boost::function<> может принимать не только укзатели на функции и на функции-члены, но и bind и labda выражения. Насколько я понял, CDelegate из статьи этого сделать не могут.


Одно из важнейших преимуществ boost::function<> в том, что он может осуществлять конверсию аргументов:

Generally, any place in which a function pointer would be used to defer a call or make a callback, Boost.Function can be used instead to allow the user greater flexibility in the implementation of the target. Targets can be any 'compatible' function object (or function pointer), meaning that the arguments to the interface designated by Boost.Function can be converted to the arguments of the target function object.

Re[3]: Отчего boost такой вычурный?
От: Gregory Россия ICQ 300403361
Дата: 29.08.03 11:01
Оценка:
Здравствуйте, MaximE, Вы писали:


ME>Признаюсь, статью на RSDN я не читал, только просмотрел.


А я "прсмотрел" доку к бусту

ME>boost::function<> может принимать не только укзатели на функции и на функции-члены, но и bind и labda выражения. Насколько я понял, CDelegate из статьи этого сделать не могут.


CDelegate из статьи так или иначе инкапсулируют функцию. bind и lambda они принимать конечно не могут, равно как и как-то обрабатывать возвращаемые значения нескольких вызовов.

boost::function штука несомнено мощная. Проникся. Но вот из-за этой мощности использовать ее мне как-то не хочется. Ну не нужна мне лямбда.


Спасибо, MaximE.
Не дай своим глазам увидеть, а ушам услышать то, что ты не сможешь объяснить.
Абрахам ван Хелсинг
Re[2]: Отчего boost такой вычурный?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 29.08.03 11:14
Оценка:
Здравствуйте, Gregory, Вы писали:

G>И еще один впрос. Если вызвать operator() делегата, который вызывает несколько функций, возвращающих скажем int, то что вернет оператор?


На этот вопрос нет прямого ответа. Можно принять последний возвращаемый результат, можно привесить какой-нить контейнер для сбора ответов, можно прекращать обработку выозва при получении определённого результата.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: Делегаты на C++
От: Аноним  
Дата: 19.12.06 09:45
Оценка:
Здравствуйте, Александр Шаргин, Вы писали:

Версия делегатов для VC 6.0 не компилится под VC 8.0 Хотелось бы иметь общую рабочую для обоих студий версию

------ Rebuild All started: Project: DelegatesDemo, Configuration: Debug Win32 ------
Deleting intermediate and output files for project 'DelegatesDemo', configuration 'Debug|Win32'
Compiling...
demo.cpp
d:\research\delegates\delegate_impl.h(19) : warning C4346: 'DelegateRetVal<T>::Type' : dependent name is not a type
        prefix with 'typename' to indicate a type
        d:\research\delegates\delegate_impl.h(21) : see reference to class template instantiation 'IDelegate0<TRet>' being compiled
d:\research\delegates\delegate_impl.h(19) : error C2146: syntax error : missing ';' before identifier 'Invoke'
d:\research\delegates\delegate_impl.h(19) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\research\delegates\delegate_impl.h(19) : warning C4183: 'Invoke': missing return type; assumed to be a member function returning 'int'
d:\research\delegates\delegate_impl.h(31) : warning C4346: 'DelegateRetVal<T>::Type' : dependent name is not a type
        prefix with 'typename' to indicate a type
        d:\research\delegates\delegate_impl.h(44) : see reference to class template instantiation 'CStaticDelegate0<TRet>' being compiled
d:\research\delegates\delegate_impl.h(31) : error C2146: syntax error : missing ';' before identifier 'Invoke'
d:\research\delegates\delegate_impl.h(31) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\research\delegates\delegate_impl.h(31) : warning C4183: 'Invoke': missing return type; assumed to be a member function returning 'int'
d:\research\delegates\delegate_impl.h(52) : warning C4346: 'DelegateRetVal<T>::Type' : dependent name is not a type
        prefix with 'typename' to indicate a type
        d:\research\delegates\delegate_impl.h(69) : see reference to class template instantiation 'CStaticDelegateVoid0<TRet>' being compiled
Re[2]: Делегаты на C++
От: Аноним  
Дата: 19.12.06 11:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Александр Шаргин, Вы писали:


А>Версия делегатов для VC 6.0 не компилится под VC 8.0 Хотелось бы иметь общую рабочую для обоих студий версию


Вообщем под VC 8.0 надо заменить в обьявлениях функций

DelegateRetVal<TRet>::Type

на
typename DelegateRetVal<TRet>::Type


Re[2]: Велосипед
От: dad  
Дата: 19.12.06 14:21
Оценка:
AS>Но.
AS>а) Статья писалась в учебных целях, чтобы показать на не очень навороченном примере как делаются такие вещи.
AS>б) Код писался с прицелом на VC (в т. ч. 6.0), который с boost'ом не дружит.
AS>в) Мне просто было интересно дойти до этого самому и получить удовольствие от процесса.

не очень навороченный пример по ходу действия превратился в гору кода.
а то если вдруг понадобится делегант для константных методов, или методов, возвращающих значение?
так же есть проблемы с методами базовых классов, применительно к указателям на дочерние классы (не помню точно на что-то напарывался там)
(надо using Base::member; в объявлении писать)

Короче, как правило овинка не стоит выделки. Для самых общих случаев (0,1 параметр) можно
простейший bind организовать а для остальных — лучше под конкретные api сделать делегатов.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[3]: Велосипед
От: dad  
Дата: 19.12.06 14:27
Оценка: 1 (1)
либо использовать готовое отполированное решение (boost)
вот тогда длействительно будет мало кода.
короче статья полезнее была бы если бы рассказывала как устроена и почему работает какая-нибудь готовая библиотека (boost) реализующая требуемый функционал
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[4]: Велосипед
От: Аноним  
Дата: 19.12.06 18:38
Оценка:
Здравствуйте, dad, Вы писали:


dad>либо использовать готовое отполированное решение (boost)

dad>вот тогда длействительно будет мало кода.
dad>короче статья полезнее была бы если бы рассказывала как устроена и почему работает какая-нибудь готовая библиотека (boost) реализующая требуемый функционал

Важна идея и подход, а реализовать одно и тоже можна по разному + не все используют boost к тому же за его лесом можна не увидеть сам принцип.

Автору
Re[5]: Велосипед
От: dad  
Дата: 19.12.06 20:19
Оценка:
А>Важна идея и подход, а реализовать одно и тоже можна по разному + не все используют boost к тому же за его лесом можна не увидеть сам принцип.

Именно об этом я и написал — разжевывать принцип на примере работающих бибилотек. вообще сорри — я дату не обратил внимания — для 2003 года статья очень ок
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[4]: Отчего boost такой вычурный?
От: johny5 Новая Зеландия
Дата: 20.12.06 00:05
Оценка:
G>boost::function штука несомнено мощная. Проникся. Но вот из-за этой мощности использовать ее мне как-то не хочется. Ну не нужна мне лямбда.

Я вот тоже долго пользовался своими велосипедами, которые принимают указатели на функции и мемберы в различных вариантах, но как только начал использовать boost::bind, был вынужден в свой велосипед встроить поддержку функторов..

Зато теперь я могу в Callback функции передавать свои параметры, игнорировать чужие, в общем как камень с души, щастлив

Вот, два хороших примера (верность синтаксиса — не главное):

№1:
bool SomeClass::on_button_click() { .. }

void SomeClass::func()
{
    boost::function< bool (const IButton* from_me) >  callback = boost::bind(on_button_click, this);
}



№2:
bool sort_func(const BigArray& a, int value1, int value2)
{
    return a[value1] < a[value2];
}

void some()
{
    BigArray arr;
    std::vector<int> indexes;

    std::sort(indexes.begin(), indexes.end(), boost::bind(sort_func, arr, _1, _2));
}


и т.д., в общем от bind-а меня теперь не отлучить
Re[5]: Отчего boost такой вычурный?
От: Sm0ke Россия ksi
Дата: 20.12.06 08:06
Оценка:
Здравствуйте, johny5, Вы писали:

<...skip...>

J>и т.д., в общем от bind-а меня теперь не отлучить


А можно ли с помощью boost 'а в качестве оконной процедуры в win api подсунуть нестатический метод с объектом?
Re[6]: Отчего boost такой вычурный?
От: johny5 Новая Зеландия
Дата: 21.12.06 00:19
Оценка:
S>А можно ли с помощью boost 'а в качестве оконной процедуры в win api подсунуть нестатический метод с объектом?

Я как понимаю, оконная процедура в win api принимает указатель на функцию?
Тогда ответ — нет, bind предоставляет функтор, функтор в общем случае не представим в виде указателя на функцию.

Простейший способ это сделать, это зарегистрировать все окна в глобальной переменной вот так:
(никогда не использовал лямбду до этого, если что, синтаксис знающие люди поправят )


#include "boost/lambda.hpp"
std::vector<WindowBase*>  windows;


template<typename WNDCLASS>
void callback_func(Event event)
{
    WindowBase* wnd = *std::find_if(windows.begin(), windows.end(), typeid(*_1) == typeid(WNDCLASS));
    wnd->on_event(event)
}


//где то ещё..

WindowBase::WindowBase()
{
    windows.push_back(this);
}
WindowBase::~WindowBase()
{
    windows.erase(std::find(windows.begin(), windows.end(), this));
}


&callback_func<HelloWindow> можно передавать в WINAPI.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.