что не так
От: Аноним  
Дата: 24.09.03 15:00
Оценка:

SampleClass::processString( const char* szString )
{
.....
}

SampleClass::processAll()
{
for_each( _vecStrings.begin(), _vecStrings.end(),  
          std::bind1st( 
               std::mem_fun( &SampleClass::processString ),
               this  
              )
         );
}


_vecStrings это член класса SampleClass ( типа vector<const char*> ) ...
вообщем хочется для каждого элемента этого вектора вызвать ф-ю processString и передать в качестве параметра этот элемент ... но не получается ....
подскажите что не так
спасибо
Re: что не так
От: Анатолий Широков СССР  
Дата: 24.09.03 15:24
Оценка:
Все так, но VC6 это не компилирует. Так что, надо будет написать для этой версии компилятора свой функтор.
Re[2]: что не так
От: Аноним  
Дата: 24.09.03 15:29
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Все так,


Если совсем честно: не указаны типы возвращаемых значений.
Re[3]: что не так
От: Анатолий Широков СССР  
Дата: 24.09.03 15:35
Оценка:
Здравствуйте, Аноним, Вы писали:

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


АШ>>Все так,


А>Если совсем честно: не указаны типы возвращаемых значений.


А я не на приведенном примере проверял:


#include <vector>
#include <algorithm>
#include <functional>

class foo
{
public:
    void process(const char *)
    {
    }

    void processall()
    {
        std::for_each(seq.begin(), seq.end(), std::bind1st(std::mem_fun(&foo::process), this));
    }

    std::vector<const char*> seq;
};


VC7 компилирует, а VC6:


C:\work\test\test.cpp(101) : error C2784: 'class std::mem_fun_t<_R,_Ty> __cdecl std::mem_fun(_R (__thiscall _Ty::*)(void))' : could not deduce template argument for '<Unknown>' from 'void (__thiscall foo::*)(const char *)'


Дальше, если привернуть вместо mem_fun mem_fun1, то возникает еще одна неприятность:


c:\program files\microsoft visual studio\vc98\include\functional(162) : error C2562: '()' : 'void' function returning a value

Re[4]: Да я так, в порядке мелкой придирки (-)
От: Аноним  
Дата: 24.09.03 15:37
Оценка: :)
Re[4]: что не так
От: ArtDenis Россия  
Дата: 24.09.03 16:03
Оценка: +1
Здравствуйте, Анатолий Широков, Вы писали:
АШ>
АШ>#include <vector>
АШ>#include <algorithm>
АШ>#include <functional>
АШ>class foo
АШ>{
АШ>public:
АШ>    void process(const char *)
АШ>    {
АШ>    }
АШ>    void processall()
АШ>    {
АШ>        std::for_each(seq.begin(), seq.end(), std::bind1st(std::mem_fun(&foo::process), this));
АШ>    }
АШ>    std::vector<const char*> seq;
АШ>};
АШ>


boost::bind в этом случае рулит:
    void processall()
    {
        std::for_each
        (
          seq.begin(),
          seq.end(),
          boost::bind(&foo::process, this, _1)
        );
    }
... << RSDN@Home 1.1 beta 1 >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[4]: что не так
От: Аноним  
Дата: 25.09.03 07:11
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

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


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


АШ>>>Все так,


А>>Если совсем честно: не указаны типы возвращаемых значений.


АШ>А я не на приведенном примере проверял:



АШ>
АШ>#include <vector>
АШ>#include <algorithm>
АШ>#include <functional>

АШ>class foo
АШ>{
АШ>public:
АШ>    void process(const char *)
АШ>    {
АШ>    }

АШ>    void processall()
АШ>    {
АШ>        std::for_each(seq.begin(), seq.end(), std::bind1st(std::mem_fun(&foo::process), this));
АШ>    }

АШ>    std::vector<const char*> seq;
АШ>};
АШ>


АШ>VC7 компилирует, а VC6:



АШ>

АШ>C:\work\test\test.cpp(101) : error C2784: 'class std::mem_fun_t<_R,_Ty> __cdecl std::mem_fun(_R (__thiscall _Ty::*)(void))' : could not deduce template argument for '<Unknown>' from 'void (__thiscall foo::*)(const char *)'


АШ>Дальше, если привернуть вместо mem_fun mem_fun1, то возникает еще одна неприятность:


Просвети плиз, чем mem_fun от mem_fun1 отличается ?


АШ>

АШ>c:\program files\microsoft visual studio\vc98\include\functional(162) : error C2562: '()' : 'void' function returning a value

Re[5]: что не так
От: Анатолий Широков СССР  
Дата: 25.09.03 07:20
Оценка:
А>Просвети плиз, чем mem_fun от mem_fun1 отличается ?

В STL VC6 mem_fun представляет функцию-член класса, не принимающую аргументов, в отличие от mem_fun1, принимающей один агрумент. Это несложно посмотреть и самому, поскольку все заголовочные файлы доступны (см. functional).
Re[5]: что не так
От: Анатолий Широков СССР  
Дата: 25.09.03 07:23
Оценка:
AD>boost::bind в этом случае рулит:
AD>
AD>    void processall()
AD>    {
AD>        std::for_each
AD>        (
AD>          seq.begin(),
AD>          seq.end(),
AD>          boost::bind(&foo::process, this, _1)
AD>        );
AD>    }
AD>


А это под VC6 компилируется (нет возможности проверить)? Я в свое время пробовал, так VC6 boost::lamda не понимал
Re[6]: что не так
От: ArtDenis Россия  
Дата: 25.09.03 07:39
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:
АШ>А это под VC6 компилируется (нет возможности проверить)? Я в свое время пробовал, так VC6 boost::lamda не понимал

Это компилируется даже C++Builder'ом 4-ым.

Денис.
... << RSDN@Home 1.1 beta 1 >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[6]: что не так
От: Аноним  
Дата: 25.09.03 08:21
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

А>>Просвети плиз, чем mem_fun от mem_fun1 отличается ?


АШ>В STL VC6 mem_fun представляет функцию-член класса, не принимающую аргументов, в отличие от mem_fun1, принимающей один агрумент. Это несложно посмотреть и самому, поскольку все заголовочные файлы доступны (см. functional).


Спасибо за разьяснение.
А почему тогда нет mem_fun2 mem_fun3 и т.д. ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.