вызов функций по указателю в for_each
От: Аноним  
Дата: 16.03.12 21:11
Оценка:
Здравствуйте.

Подскажите пожайлуста можно ли как нибудь реализовать следующее:

typedef void (*TRC_can)(const scanmsg_t* _msg);
typedef list<TRC_can> l_rc_func;

l_rc_func   l_temp;


void rc_msg(const scanmsg_t* _msg)
{
   l_rc_func::iterator i_cur = l_temp.begin();
   for ( ; i_cur != l_temp.end(); ++i_cur)
     (*i_cur)(_msg);
}



только через алгоритм for_each(l_temp.begin(), l_temp.end(), ....).
Пытался через boost::bind, но так и не понял как вызвать код (*i_cur)(_msg) ?????
Re: вызов функций по указателю в for_each
От: Voivoid Россия  
Дата: 16.03.12 21:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>только через алгоритм for_each(l_temp.begin(), l_temp.end(), ....).

А>Пытался через boost::bind, но так и не понял как вызвать код (*i_cur)(_msg) ?????


std::for_each( l_temp.begin(), l_temp.end(), boost::bind( boost::apply<void>(), _1, _msg ) );
Re: вызов функций по указателю в for_each
От: Сыроежка  
Дата: 16.03.12 22:15
Оценка: -4 :)
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте.


А>Подскажите пожайлуста можно ли как нибудь реализовать следующее:


А>
А>typedef void (*TRC_can)(const scanmsg_t* _msg);
А>typedef list<TRC_can> l_rc_func;

А>l_rc_func   l_temp;


А>void rc_msg(const scanmsg_t* _msg)
А>{
А>   l_rc_func::iterator i_cur = l_temp.begin();
А>   for ( ; i_cur != l_temp.end(); ++i_cur)
А>     (*i_cur)(_msg);
А>}
А>



А>только через алгоритм for_each(l_temp.begin(), l_temp.end(), ....).

А>Пытался через boost::bind, но так и не понял как вызвать код (*i_cur)(_msg) ?????

Вот простой пример, скомпилированный с помощью MS VC++ 2010. И мой вам совет на будущее, не используйте boost.


#include    "stdafx.h"
#include    <iostream>
#include    <list>
#include    <algorithm>

typedef void ( *pf )( int );

void f1( int x )
{
    std::cout << "f1( int )\n";
}

void f2( int x )
{
    std::cout << "f2( int )\n";
}

void f3( int x )
{
    std::cout << "f1( int )\n";
}

void fn( const std::list<pf> &l, int x )
{

    std::for_each( l.begin(), l.end(),
        [&x]( pf f ){ f( x ); } );
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::list<pf> l;
    l.push_back( f1 );
    l.push_back( f2 );
    l.push_back( f3 );
    fn( l, 10 );

    куегкт ( 0 );
}
Меня можно встретить на www.cpp.forum24.ru
Re[2]: вызов функций по указателю в for_each
От: Сыроежка  
Дата: 16.03.12 22:18
Оценка:
Здравствуйте, Сыроежка, Вы писали:

В конце в коде опечатка. Я предложение return ( 0 ); набрал кирилицей.
Меня можно встретить на www.cpp.forum24.ru
Re[2]: вызов функций по указателю в for_each
От: nen777w  
Дата: 16.03.12 22:57
Оценка:
С>Вот простой пример, скомпилированный с помощью MS VC++ 2010. И мой вам совет на будущее, не используйте boost.
Затравка на холивар?
Re[3]: вызов функций по указателю в for_each
От: Ops Россия  
Дата: 16.03.12 23:23
Оценка:
Здравствуйте, nen777w, Вы писали:

С>>Вот простой пример, скомпилированный с помощью MS VC++ 2010. И мой вам совет на будущее, не используйте boost.

N>Затравка на холивар?
Да просто юношеский максимализм. Стандарт учить, конечно же, хорошо, но и реальные задачи решать иногда приходится, не буквоедством единым...
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[4]: вызов функций по указателю в for_each
От: Сыроежка  
Дата: 16.03.12 23:52
Оценка: +1 -3 :)
Здравствуйте, Ops, Вы писали:

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


С>>>Вот простой пример, скомпилированный с помощью MS VC++ 2010. И мой вам совет на будущее, не используйте boost.

N>>Затравка на холивар?
Ops>Да просто юношеский максимализм. Стандарт учить, конечно же, хорошо, но и реальные задачи решать иногда приходится, не буквоедством единым...


Это дурной тон, когда то, что можно спокойно сделать с помощью стандартных средств, делают с помощью сторонних библиотек. Это лишь говорит о невысокой квалификации программиста. Во-первых, он совершенно не понимает, что не следует для читающего вашу программу усложнять код и требовать от него знаний каких-то третьесторонних библиотек. Во-вторых, это говорит о том. что программист слабо владеет стандартными средствами и прилюбом мало-малськой трудности бежит искать третьесторонние библиотеки.
Так что речь идет не о каком-то "юношеском максимализме", а о том, что вы еще слабо представляете, что такое хорошо написанный код.
Как раз юношеский максимализм заключается в том, чтобы перед всеми похвастаться, что, молЮ смотрите, сколько я знаю разных библиотек! Поэтому очень часто молодые люди, такие, как вы, спешат чиать boost, не зная в достаточной мере С++, чтобы при поступлении на работу попазировать, мол, вот, я какой крутой, boost знаю! А спросишь его про С++, и оказывается, что он его-то и не знает!
На одном сайте один такой юноша задавал вопрос. Цитирую его буквально по памяти: "Я прочитал уже одну треть книги Шилдта "С++ для начинающих". не подскажите мне, что мне теперь почитать по графическому и сетевому прогграммированию".
Это слово в слово. Я ничсего своего не добавил. Вот точно такая же плеяда появилась молодых программистов, которые прочитали одну треть книги Шилдта "С++ для начинающих" и спешат заявить, что они уже знакомы с boost. На этом же форуме один молодой человек к месту и не кместу всегда ставлял функции из boost, как например, const_begin. Когда я его спросил, зачем вы используете эту функцию для простого приера и включаете дополнительные заголовочные файлы из boost, когда есть стандартная аналогичная глобальная функция std::begin, он очень удивился!
Меня можно встретить на www.cpp.forum24.ru
Re[2]: вызов функций по указателю в for_each
От: SCRABER  
Дата: 17.03.12 08:59
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>void fn( const std::list<pf> &l, int x )

С>{

С> std::for_each( l.begin(), l.end(),

С> [&x]( pf f ){ f( x ); } );
С>}
С>[/ccode]

У меня вот это не компилируется ?????
Embarcadero C++ Builder XE2.
Программер
Re[2]: вызов функций по указателю в for_each
От: SCRABER  
Дата: 17.03.12 09:01
Оценка:
Здравствуйте, Voivoid, Вы писали:

V>Здравствуйте, Аноним, Вы писали:


А>>только через алгоритм for_each(l_temp.begin(), l_temp.end(), ....).

А>>Пытался через boost::bind, но так и не понял как вызвать код (*i_cur)(_msg) ?????


V>
V>std::for_each( l_temp.begin(), l_temp.end(), boost::bind( boost::apply<void>(), _1, _msg ) );
V>



Спасибо за пример. Все отлично работает.
Где можно поподробнее прочитать про boost::apply желательно с примерами
Спасибо заранее за ответ.
Программер
Re[3]: вызов функций по указателю в for_each
От: Сыроежка  
Дата: 17.03.12 09:11
Оценка:
Здравствуйте, SCRABER, Вы писали:

SCR>Здравствуйте, Сыроежка, Вы писали:


С>>void fn( const std::list<pf> &l, int x )

С>>{

С>> std::for_each( l.begin(), l.end(),

С>> [&x]( pf f ){ f( x ); } );
С>>}
С>>[/ccode]

SCR>У меня вот это не компилируется ?????

SCR>Embarcadero C++ Builder XE2.

Мораль: давно известно, что продукты Borland никогда не соответствовали стандарту, отставали по внедрению новых положений стандарта и имели заоблочную цену!
Сейчас Embarcadero проводит агрессивную рекламную компанию по протолкиванию своих средств разработки XE2. Теперь буду знать, что не следует покупать их продукты не только изз-за завышенной цены (у них upgrade идет по цене, дороже нового продукта!), но также из-за того, что их компилятор не поддерживает новый стандарт С++. То есть это все равно, что лпатить деньги за то, что уже бесполезно.

Скорей ввего ваш компилчятор не поддерживает лямбда-выражения. если бы вы указали сообщение об ошибке, можно было бы более точно определить причину, почему код не компилируется. Но в любом случае лямбда-выражение можно заменить функциональным объектом.
Меня можно встретить на www.cpp.forum24.ru
Re[4]: вызов функций по указателю в for_each
От: SCRABER  
Дата: 17.03.12 09:21
Оценка:
Здравствуйте, Сыроежка, Вы писали:

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


SCR>>Здравствуйте, Сыроежка, Вы писали:


С>>>void fn( const std::list<pf> &l, int x )

С>>>{

С>>> std::for_each( l.begin(), l.end(),

С>>> [&x]( pf f ){ f( x ); } );
С>>>}
С>>>[/ccode]

SCR>>У меня вот это не компилируется ?????

SCR>>Embarcadero C++ Builder XE2.

С>Мораль: давно известно, что продукты Borland никогда не соответствовали стандарту, отставали по внедрению новых положений стандарта и имели заоблочную цену!

С>Сейчас Embarcadero проводит агрессивную рекламную компанию по протолкиванию своих средств разработки XE2. Теперь буду знать, что не следует покупать их продукты не только изз-за завышенной цены (у них upgrade идет по цене, дороже нового продукта!), но также из-за того, что их компилятор не поддерживает новый стандарт С++. То есть это все равно, что лпатить деньги за то, что уже бесполезно.

С>Скорей ввего ваш компилчятор не поддерживает лямбда-выражения. если бы вы указали сообщение об ошибке, можно было бы более точно определить причину, почему код не компилируется. Но в любом случае лямбда-выражение можно заменить функциональным объектом.


К сожалению конкретно сейчас под рукой XE2 нет.
Есть Embarcadero Borland C++ Builder 2010.

Ошибка:
[BCC32 Error] File1.cpp(31): E2188 Expression syntax
File1.cpp(29): parsing: void fn(const std::list<void (*)(int),std::allocator<void (*)(int)> > &,int)
Программер
Re[3]: вызов функций по указателю в for_each
От: Voivoid Россия  
Дата: 17.03.12 09:40
Оценка:
Здравствуйте, SCRABER, Вы писали:

SCR>Где можно поподробнее прочитать про boost::apply желательно с примерами

В документации по boost::bind
Re[5]: вызов функций по указателю в for_each
От: Сыроежка  
Дата: 17.03.12 09:41
Оценка:
Здравствуйте, SCRABER, Вы писали:

SCR>Здравствуйте, Сыроежка, Вы писали:


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


SCR>>>Здравствуйте, Сыроежка, Вы писали:


С>>>>void fn( const std::list<pf> &l, int x )

С>>>>{

С>>>> std::for_each( l.begin(), l.end(),

С>>>> [&x]( pf f ){ f( x ); } );
С>>>>}
С>>>>[/ccode]

SCR>>>У меня вот это не компилируется ?????

SCR>>>Embarcadero C++ Builder XE2.

С>>Мораль: давно известно, что продукты Borland никогда не соответствовали стандарту, отставали по внедрению новых положений стандарта и имели заоблочную цену!

С>>Сейчас Embarcadero проводит агрессивную рекламную компанию по протолкиванию своих средств разработки XE2. Теперь буду знать, что не следует покупать их продукты не только изз-за завышенной цены (у них upgrade идет по цене, дороже нового продукта!), но также из-за того, что их компилятор не поддерживает новый стандарт С++. То есть это все равно, что лпатить деньги за то, что уже бесполезно.

С>>Скорей ввего ваш компилчятор не поддерживает лямбда-выражения. если бы вы указали сообщение об ошибке, можно было бы более точно определить причину, почему код не компилируется. Но в любом случае лямбда-выражение можно заменить функциональным объектом.


SCR>К сожалению конкретно сейчас под рукой XE2 нет.

SCR>Есть Embarcadero Borland C++ Builder 2010.

SCR>Ошибка:

SCR>[BCC32 Error] File1.cpp(31): E2188 Expression syntax
SCR> File1.cpp(29): parsing: void fn(const std::list<void (*)(int),std::allocator<void (*)(int)> > &,int)

Я не вижу здесь синтаксической ошибки. Данное предложение

void fn( const std::list<pf> &l, int x )

из определения функции fn корректно, тем более, что я просто скопировал сюда уже оттранслированный код.
А есть ли еще дполнительные сообщения кроме данного аскетского сообщения? Вполне возможно, что это сообщение — реакция на ошибку, которая расположена в коде перед этой строкой.
Есть два варианта. Сначала закоментируйте предложение в функции main, где происходит вызов алгоритма for_each. Если код скомпилируется, то значит данное сообщение об ошибке есть не является следствием синтаксической ошибке.

Второе — я хорошо помню, что компиляторы Borland не могли работать с квалификатором const у массивов и контейнеров, когда те использовались со стандартными алгоритмами. То есть компилятор при инстанциировании шаблонов не справлялся с квалификатором const.
Поэтому когда выполните первую проверку, и код у вас скомпилируется ( в чем я не сомневаюсь, если только вы не сделали опечатку ), то просто уберите в объявлении первого параметра функции квалификатор const
Меня можно встретить на www.cpp.forum24.ru
Re[6]: вызов функций по указателю в for_each
От: SCRABER  
Дата: 17.03.12 10:12
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>Я не вижу здесь синтаксической ошибки. Данное предложение


С>void fn( const std::list<pf> &l, int x )


С>из определения функции fn корректно, тем более, что я просто скопировал сюда уже оттранслированный код.

С>А есть ли еще дполнительные сообщения кроме данного аскетского сообщения? Вполне возможно, что это сообщение — реакция на ошибку, которая расположена в коде перед этой строкой.
С>Есть два варианта. Сначала закоментируйте предложение в функции main, где происходит вызов алгоритма for_each. Если код скомпилируется, то значит данное сообщение об ошибке есть не является следствием синтаксической ошибке.

С>Второе — я хорошо помню, что компиляторы Borland не могли работать с квалификатором const у массивов и контейнеров, когда те использовались со стандартными алгоритмами. То есть компилятор при инстанциировании шаблонов не справлялся с квалификатором const.

С>Поэтому когда выполните первую проверку, и код у вас скомпилируется ( в чем я не сомневаюсь, если только вы не сделали опечатку ), то просто уберите в объявлении первого параметра функции квалификатор const

Никаких других ошибок компилятор не выдает.
Вообщем то он ругается не на объявление функции, а на строку

std::for_each( l.begin(), l.end(), [&x]( pf f ){ f( x ); } );


Если ее за комментировать, то все компилится.
void fn( const std::list<pf> &l, int x )
{

//     std::for_each( l.begin(), l.end(), [&x]( pf f ){ f( x ); } ); // it's ok
}


Слудующий код:

void fn( std::list<pf> &l, int x )
{
 std::for_each( l.begin(), l.end(), [&x]( pf f ){ f( x ); } ); // error
}


увы ошибка парсинга. Скорее всего компилятор не поддерживает синтаксиси лямбда-выражений.
Где можно посмотреть на синтаксис лямбда-выражений для С++, а то все встречается для С#?
Программер
Re[7]: вызов функций по указателю в for_each
От: Сыроежка  
Дата: 17.03.12 10:27
Оценка:
Здравствуйте, SCRABER, Вы писали:

SCR>Здравствуйте, Сыроежка, Вы писали:


С>>Я не вижу здесь синтаксической ошибки. Данное предложение


С>>void fn( const std::list<pf> &l, int x )


С>>из определения функции fn корректно, тем более, что я просто скопировал сюда уже оттранслированный код.

С>>А есть ли еще дполнительные сообщения кроме данного аскетского сообщения? Вполне возможно, что это сообщение — реакция на ошибку, которая расположена в коде перед этой строкой.
С>>Есть два варианта. Сначала закоментируйте предложение в функции main, где происходит вызов алгоритма for_each. Если код скомпилируется, то значит данное сообщение об ошибке есть не является следствием синтаксической ошибке.

С>>Второе — я хорошо помню, что компиляторы Borland не могли работать с квалификатором const у массивов и контейнеров, когда те использовались со стандартными алгоритмами. То есть компилятор при инстанциировании шаблонов не справлялся с квалификатором const.

С>>Поэтому когда выполните первую проверку, и код у вас скомпилируется ( в чем я не сомневаюсь, если только вы не сделали опечатку ), то просто уберите в объявлении первого параметра функции квалификатор const

SCR>Никаких других ошибок компилятор не выдает.

SCR>Вообщем то он ругается не на объявление функции, а на строку

SCR>
SCR>std::for_each( l.begin(), l.end(), [&x]( pf f ){ f( x ); } );
SCR>


SCR>Если ее за комментировать, то все компилится.

SCR>
SCR>void fn( const std::list<pf> &l, int x )
SCR>{

SCR>//     std::for_each( l.begin(), l.end(), [&x]( pf f ){ f( x ); } ); // it's ok
SCR>}
SCR>


SCR>Слудующий код:


SCR>
SCR>void fn( std::list<pf> &l, int x )
SCR>{
SCR> std::for_each( l.begin(), l.end(), [&x]( pf f ){ f( x ); } ); // error
SCR>}
SCR>


SCR>увы ошибка парсинга. Скорее всего компилятор не поддерживает синтаксиси лямбда-выражений.

SCR>Где можно посмотреть на синтаксис лямбда-выражений для С++, а то все встречается для С#?

Да, скорей всего ваш компилятор BBorland не поддерживает лямбда-выражения. Достаточно хорошо вместе с познавательными примерами лямбда-выражения описаны у Майкрософт. Посмотрите здесь.

Также на моей страничке, которая указана ниже, в различных темах раздела С/С++, например, "Два языка С++ в одном яззыке", "Вывод на консоль — широкий выбор средств в С++" имеются наглядные простые примеры использования лямбда-выражений. Кроме того мною описаны различные баги лямбда-выражений в компиляторе MS VC++ 2010. Они полезны тем, что демонстрируют, как правильно должны работать лямбда-выражения. Ну, и конечно нужно читать стандарт С++.
Меня можно встретить на www.cpp.forum24.ru
Re[8]: вызов функций по указателю в for_each
От: Ops Россия  
Дата: 17.03.12 10:42
Оценка: +1 :)
Здравствуйте, Сыроежка, Вы писали:

Конечно, компилятор виноват. И куча других других тоже не скомпилируют. Все виноваты, кроме Сыроежки, который выучил последний стандарт, а остальные отправил на помойку, и поучает не пользоваться ничем, кроме еще несуществующих компиляторов, которые возможно когда-нибудь будут этот стандарт полностью поддерживать.
Только вот писать-то надо сейчас, и на том, что есть.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[9]: вызов функций по указателю в for_each
От: Сыроежка  
Дата: 17.03.12 10:54
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Здравствуйте, Сыроежка, Вы писали:


Ops>Конечно, компилятор виноват. И куча других других тоже не скомпилируют. Все виноваты, кроме Сыроежки, который выучил последний стандарт, а остальные отправил на помойку, и поучает не пользоваться ничем, кроме еще несуществующих компиляторов, которые возможно когда-нибудь будут этот стандарт полностью поддерживать.

Ops>Только вот писать-то надо сейчас, и на том, что есть.

Лямбда-выражения -это ничто иное, как "синтаксический сахар", который вполне легко и безболезненно заменяется функциональными объектами. Так что если есть потребность писать код "сейчас на том, что есть", то очевидно стоит обратить свое внимание в первую очередь на стандартные конструкции с использованием функциональных объектов. Тогда ваш код будет переносим, соответствовать стандарту и не будет зависеть от третьесторонних библиотек.
Меня можно встретить на www.cpp.forum24.ru
Re[9]: вызов функций по указателю в for_each
От: Сыроежка  
Дата: 17.03.12 11:25
Оценка:
Здравствуйте, Ops, Вы писали:

Посмотрите непредвзято и хладнокровно на то, как разворачивается обсуждение исхоодного вопроса темы.

Я предложил использовать стандартные средства языка


void fn( const std::list<pf> &l, int x )
{

    std::for_each( l.begin(), l.end(),
        [&x]( pf f ){ f( x ); } );
}


Допустим, что ваш компилятор не поддерживает лямбда-выражения. Но приведенный код с лямбда выражением настолько прозрачен и поонятен, что очень легко написать функциональный объект. То есть конструкция лямбда-выражения вида [&x] эквивалентна тому, что конструктору функционального объекта нужно передать аргумент, ссылка на который или само значение будут храниться в функциональном объекте и использоваться при вызове оператор-функции.
То есть проблем никаких нет.
А что мы видим из обсуждения? Очевидно, что автор темы ранее не имел опыта написания функциональных объектов. Вместо того, чтобы такой опыт приобрести, который обязателен для каждого программиста С++, он сразу же начинает хвататься за boost! При этом в boost код достаточно сложнее для изучения, могут быть побочные эффекты, о которых вы даже не подозреваете, так как ваш компилятор может иметь собственные особенности поведения. К тому же выбудете вынуждены будете тянуть за собой кишку заголовочных файлов из boost, а также подключать к вашему проекту библиотеки boost. И все это ради замены простого функционального объекта.
Как известно, компиляторы очень быстро обновляются. например, тот же майкрософт сейчас каждый год обновляет свой компилятор. Уже анонсировали MS VC++ 11.
Представьте теперь, что в ваше проект придет новый сотрудник. Он увидет такие ваши ухищрения ради простого объекта, крайне удивится, почему такие вещи так сложно делаются, тем более, что новый компилятор предоставляет еще более эффективные и выразительные средства, и покрутит пальцем у виска, глядя на вас!
Но хуже того, теперь вы уже вынуждены будете тянуть эти библиотеки boost, функциональность которых полностью дублируется стандартными средствами. Ваш проект будет огромен и плохо управляем, так как если возникнет какая-то ошибка, то вам придется проверять все места в коде, а значит все подключаемые библиотеки, чтобы найти причину ошибки.
Фактически, ваш код превращаются в сборную солянку, где из-за каждого "чиха" подключается некая третьесторонняя библиотека, которая к тому же гарантирует, что в ней самой нет багов! Так как исправленичя вносились и вносятся и в boost. Вам трудно будет поддерживать общий стиль программирования проекта, так как вы вынуждены быдете либо использовать старые средства boost, которые уже морально устарели, либо использовать новые возможности стандарта. И эта дилемма постоянно вам будет мешать в развитии проекта.
Вам приходится предъявлять малообоснованные требования к новым сотрудникам. Ээффективность работы группы в связи с этим резко снижается, так новому сотруднику надо изучать все ваши искусственно-насаждаемые примочки. А самое главное у нового сотрудника будет отторжение ваших примочек, так как он хорошо знает, что это можно легко и более выразительно сделать с помощью стандартных средств.
Меня можно встретить на www.cpp.forum24.ru
Re[10]: вызов функций по указателю в for_each
От: SCRABER  
Дата: 17.03.12 11:48
Оценка:
Здравствуйте, Сыроежка, Вы писали:


С>А что мы видим из обсуждения? Очевидно, что автор темы ранее не имел опыта написания функциональных объектов. Вместо того, чтобы такой опыт приобрести, который обязателен для каждого программиста С++, он сразу же начинает хвататься за boost!

Честно говоря про функциональные объекты мне известно. Они неплохо описаны у Майерса. С чего вы сделали вывод про меня непонятно. Да ну ладно.
За boost я схватился только из-за того, чтобы поставить себе цель не составляя дополнительного кода (в виде функциональных объектов) написать одной строкой.
Вариант с лябмда-выражением мне конечно же показался более удачным по отношению написания кода, так как гарантирует переносимость, но в связи с ограничениями используемого мной компилятора отказался и предпочел воспользоваться библиотекой boost, чтобы изучить и этот вопрос по глубже. В конце концов каждый должен знать несколько способов решений одной и той же задачи, чтобы в будущем уметь применить свой накопленный опыт.

Как вы думаете что будет выигрывать по скорости работы лямбда-выражения или функциональный объект ???

С>Как известно, компиляторы очень быстро обновляются. например, тот же майкрософт сейчас каждый год обновляет свой компилятор. Уже анонсировали MS VC++ 11.

С>Представьте теперь, что в ваше проект придет новый сотрудник. Он увидет такие ваши ухищрения ради простого объекта, крайне удивится, почему такие вещи так сложно делаются, тем более, что новый компилятор предоставляет еще более эффективные и выразительные средства, и покрутит пальцем у виска, глядя на вас!
С>Но хуже того, теперь вы уже вынуждены будете тянуть эти библиотеки boost, функциональность которых полностью дублируется стандартными средствами. Ваш проект будет огромен и плохо управляем, так как если возникнет какая-то ошибка, то вам придется проверять все места в коде, а значит все подключаемые библиотеки, чтобы найти причину ошибки.
С>Фактически, ваш код превращаются в сборную солянку, где из-за каждого "чиха" подключается некая третьесторонняя библиотека, которая к тому же гарантирует, что в ней самой нет багов! Так как исправленичя вносились и вносятся и в boost. Вам трудно будет поддерживать общий стиль программирования проекта, так как вы вынуждены быдете либо использовать старые средства boost, которые уже морально устарели, либо использовать новые возможности стандарта. И эта дилемма постоянно вам будет мешать в развитии проекта.
С>Вам приходится предъявлять малообоснованные требования к новым сотрудникам. Ээффективность работы группы в связи с этим резко снижается, так новому сотруднику надо изучать все ваши искусственно-насаждаемые примочки. А самое главное у нового сотрудника будет отторжение ваших примочек, так как он хорошо знает, что это можно легко и более выразительно сделать с помощью стандартных средств.

+10000
Эту идею я полностью разделяю.
Программер
Re[10]: вызов функций по указателю в for_each
От: Ops Россия  
Дата: 17.03.12 12:18
Оценка:
Здравствуйте, Сыроежка, Вы писали:

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


С>Посмотрите непредвзято и хладнокровно на то, как разворачивается обсуждение исхоодного вопроса темы.


С>Я предложил использовать стандартные средства языка



С>
С>void fn( const std::list<pf> &l, int x )
С>{
С>    std::for_each( l.begin(), l.end(),
С>        [&x]( pf f ){ f( x ); } );
С>}
С>


С>Допустим, что ваш компилятор не поддерживает лямбда-выражения. Но приведенный код с лямбда выражением настолько прозрачен и поонятен, что очень легко написать функциональный объект. То есть конструкция лямбда-выражения вида [&x] эквивалентна тому, что конструктору функционального объекта нужно передать аргумент, ссылка на который или само значение будут храниться в функциональном объекте и использоваться при вызове оператор-функции.

С>То есть проблем никаких нет.

Тут согласен.

С>А что мы видим из обсуждения? Очевидно, что автор темы ранее не имел опыта написания функциональных объектов. Вместо того, чтобы такой опыт приобрести, который обязателен для каждого программиста С++, он сразу же начинает хвататься за boost! При этом в boost код достаточно сложнее для изучения, могут быть побочные эффекты, о которых вы даже не подозреваете, так как ваш компилятор может иметь собственные особенности поведения.


Особенности есть скорее у библиотек студии, если взять тот же bind, то он в 2010 багнутый, а бустовский работает нормально.

С>К тому же выбудете вынуждены будете тянуть за собой кишку заголовочных файлов из boost, а также подключать к вашему проекту библиотеки boost. И все это ради замены простого функционального объекта.


Ради одного конечно не стоит, но когда их будут тысячи, можно и потаскать.

С>Как известно, компиляторы очень быстро обновляются. например, тот же майкрософт сейчас каждый год обновляет свой компилятор. Уже анонсировали MS VC++ 11.


А многие еще на 6 пишут, и не из-за лени и нищебродства, а по объективным причинам.

С>Представьте теперь, что в ваше проект придет новый сотрудник. Он увидет такие ваши ухищрения ради простого объекта, крайне удивится, почему такие вещи так сложно делаются, тем более, что новый компилятор предоставляет еще более эффективные и выразительные средства, и покрутит пальцем у виска, глядя на вас!


Мне как-то наплевать на его мнение. Проекты существуют годами, и переделывать их из-за появления нового стандарта ни один разумный человек не будет.

С>Но хуже того, теперь вы уже вынуждены будете тянуть эти библиотеки boost, функциональность которых полностью дублируется стандартными средствами. Ваш проект будет огромен и плохо управляем, так как если возникнет какая-то ошибка, то вам придется проверять все места в коде, а значит все подключаемые библиотеки, чтобы найти причину ошибки.

С>Фактически, ваш код превращаются в сборную солянку, где из-за каждого "чиха" подключается некая третьесторонняя библиотека, которая к тому же гарантирует, что в ней самой нет багов! Так как исправленичя вносились и вносятся и в boost. Вам трудно будет поддерживать общий стиль программирования проекта, так как вы вынуждены быдете либо использовать старые средства boost, которые уже морально устарели, либо использовать новые возможности стандарта. И эта дилемма постоянно вам будет мешать в развитии проекта.

А если не использовать сторонних библиотек, то получится гора из велосипедов, с которыми разбираться еще сложнее. Не говоря уже о том, что разработка будет стоить намного дороже.
В этом плане буст, не смотря на все его недостатки, как раз одна из лучших библиотек, оттуда многое переходит в стандарт с минимальными изменениями, только эти фичи появляются в нем на годы раньше. К сожалению, иногда приходится использовать гораздо менее качественные библиотеки, и в реальном проекте никуда от этого не деться.

С>Вам приходится предъявлять малообоснованные требования к новым сотрудникам. Ээффективность работы группы в связи с этим резко снижается, так новому сотруднику надо изучать все ваши искусственно-насаждаемые примочки. А самое главное у нового сотрудника будет отторжение ваших примочек, так как он хорошо знает, что это можно легко и более выразительно сделать с помощью стандартных средств.


Вполне обоснованные требования, лучше потратить пару месяцев на освоение библиотеки, чем потом на каждый чих по 2 недели писать новый велосипед.
Советую немножко перестать теоретизировать, и поучаствовать в реальном проекте. Я думаю, ты или изменишь мнение о библиотеках, или завалишь сроки.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[11]: вызов функций по указателю в for_each
От: Сыроежка  
Дата: 17.03.12 12:31
Оценка:
Здравствуйте, SCRABER, Вы писали:

SCR>За boost я схватился только из-за того, чтобы поставить себе цель не составляя дополнительного кода (в виде функциональных объектов) написать одной строкой.


Дело в том, что в отношении boost просто создается иллюзия, что вы пишите одной строкой. На самом деле вы включаете заголвочные файлы, где помещены оопределения множества типов и классов и конструкций, которые по объему значительно превосходят функциональный объект. К тому же не исключено, что вам еще помимо заголовков потребуется подключать библиотеки boost, что сделает ваш проект более громоздким.

SCR>В конце концов каждый должен знать несколько способов решений одной и той же задачи, чтобы в будущем уметь применить свой накопленный опыт.


Здесь я с вами полностью согласен, так как расширение кругозора идет только на пользу.

SCR>Как вы думаете что будет выигрывать по скорости работы лямбда-выражения или функциональный объект ???


Это сложный вопрос, на который я не в состоянии дать однозначный ответт. Так как коомпилятор на самом деле, фактически, за вас создает функциональный объект и может в него включать излишние вещи, как, например, оператор приведения типа к указателю на функцию для оператор-функции, который вам на самом деле в данной конкретной ситуации совсем не нужен.
Меня можно встретить на www.cpp.forum24.ru
Re[11]: вызов функций по указателю в for_each
От: Сыроежка  
Дата: 17.03.12 13:01
Оценка:
Здравствуйте, Ops, Вы писали:

Консервативность часто заканчивается реакционностью!
Вы даже не заметите, как развитие вашего проекта просто топчется на месте.
Меня можно встретить на www.cpp.forum24.ru
Re[11]: вызов функций по указателю в for_each
От: Сыроежка  
Дата: 17.03.12 14:02
Оценка:
Здравствуйте, SCRABER, Вы писали:

Кстати сказать, если вы хотите попробовать выполнить пример, который я предоставил, то можете воспользоваться онлайновым компилятором!

Только вам в моем примере надо исключить первый специфический заголовок компилятора Майкрософт, а функцию main объявить просто, как

int main()
Меня можно встретить на www.cpp.forum24.ru
Re[12]: вызов функций по указателю в for_each
От: SCRABER  
Дата: 17.03.12 16:49
Оценка:
Здравствуйте, Сыроежка, Вы писали:

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


С>Кстати сказать, если вы хотите попробовать выполнить пример, который я предоставил, то можете воспользоваться онлайновым компилятором!


С>Только вам в моем примере надо исключить первый специфический заголовок компилятора Майкрософт, а функцию main объявить просто, как


С>int main()


Попробовал ваш код на VS 2011 все нормально компилируется.
Спасибо за совет. Буду поподробней изучать лямбда-выражения и их применимость в проектах.
Программер
Re[2]: вызов функций по указателю в for_each
От: Logot Украина  
Дата: 17.03.12 18:37
Оценка: 11 (2) +2
Здравствуйте, Сыроежка, Вы писали:

С>Вот простой пример, скомпилированный с помощью MS VC++ 2010. И мой вам совет на будущее, не используйте boost.


А вот вам мой совет! Не нужно указывать что и кому использовать, хорошим тоном будет предложить разные варианты решения задачи. Человек пусть сам выберет...
Re[2]: Mystery Solved!
От: lxa http://aliakseis.livejournal.com
Дата: 25.07.12 14:29
Оценка:
#include    <iostream>
#include    <list>
#include    <algorithm>
#include    <functional> 

using namespace std::placeholders;
using std::bind;

typedef void ( *pf )( int );

void f1( int x )
{
    std::cout << "f1( int )\n";
}

void f2( int x )
{
    std::cout << "f2( int )\n";
}

void f3( int x )
{
    std::cout << "f3( int )\n";
}


void fn( const std::list<pf> &l, int x )
{
    typedef std::pointer_to_unary_function<int, void> FuncObj;
    auto fun = bind(&FuncObj::operator(), bind<FuncObj>(std::ptr_fun<int, void>, _1), x);
    std::for_each(l.begin(), l.end(), fun);
}


int main(int argc, char* argv[])
{
    std::list<pf> l;
    l.push_back( f1 );
    l.push_back( f2 );
    l.push_back( f3 );
    fn( l, 10 );

    return 0;
}
Re[5]: вызов функций по указателю в for_each
От: IROV..  
Дата: 25.07.12 16:31
Оценка:
Здравствуйте, Сыроежка, Вы писали:

"Вот на новом С++ можно написать тоже самое и без буста, потомучто в нем уже встроены базовые лямбды", хрен придерешся
ну и желательно ответ на класическом С++



По поводу того что "не юзайте буст", с одной стороны да с другой нет.
Я например часто встречаю и симетричные случаи когда человек не зная про реализованые вещи в бусте пишет самопальный кривой код. На вопрос почему не буст? ответ, он страшный большой, долго работает и вообще мое компактней и лучше, а эти ошибки я скоро поправлю.

вот такая жизнь.

Ну а про уникомов которые знают буст но не знают С++ это отдельная ветка, кстати эти же люди не могут написать даже Модель для крестиков ноликов, а это уже реальный ппц.
я не волшебник, я только учусь!
Re[12]: вызов функций по указателю в for_each
От: jazzer Россия Skype: enerjazzer
Дата: 27.07.12 01:04
Оценка: :)
Здравствуйте, Сыроежка, Вы писали:

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


С>Консервативность часто заканчивается реакционностью!

С>Вы даже не заметите, как развитие вашего проекта просто топчется на месте.

Из-за того, что компилятор не поддерживает лямбды
Причем это произошло ровно в день принятия нового стандарта.
Как проект развивался до этого — остается лишь догадываться
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[3]: вызов функций по указателю в for_each
От: jazzer Россия Skype: enerjazzer
Дата: 27.07.12 01:11
Оценка: +1
Здравствуйте, SCRABER, Вы писали:

SCR>У меня вот это не компилируется ?????

SCR>Embarcadero C++ Builder XE2.

Юзай буст и не парься. Буст — это общий знаменатель для компиляторов (в смысле что новые фичи по возможности эмулируются и работают на старых компиляторах, например, BOOST_AUTO), плюс практически все, что было добавлено в стандартную библиотеку в новом стандарте, пришло именно из буста и было в нем доступно уже лет 10 как.
И со следующим стандартом так же будет ,скорее всего.
Так что, изучая буст, в каком-то смысле изучаешь будущий стандарт.

А Сыроежку ты слушай, делая скидку на то, что он Воин Стандарта.
По-сыроежкиному получается, что все эти 10 лет нужно было сосать лапу с убогой стандартной библиотекой С++98, лишь бы не буст.
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[3]: Mystery Solved!
От: lxa http://aliakseis.livejournal.com
Дата: 01.08.12 16:04
Оценка:
Этот пример работает как с boost::bind, так и std::bind. Однако ptr_fun объявлена устаревшей. Найти похожее решение, работающее с boost и std без устаревших функций навскидку что-то не получается. Можно вместо ptr_fun забайндить сам bind, но в целом это не срабатывает. Похоже, это не имеет практического смысла, но все равно интересно было бы посмотреть на возможное решение ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.