вызов функций по указателю в 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 недели писать новый велосипед.
Советую немножко перестать теоретизировать, и поучаствовать в реальном проекте. Я думаю, ты или изменишь мнение о библиотеках, или завалишь сроки.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.