Re[3]: Извращать, так извращать :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 11.03.05 14:14
Оценка:
Здравствуйте, Anfi, Вы писали:

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


E>>Ну а так-то почему нельзя сделать (если уж очень нужно):

E>>void call_Boo( A * p ) { ((B *)p)->Boo(); }
E>>std::for_each(AV.begin(), AV.end(), call_Boo );

A>Можно, конечно, но "неаккуратненько как-то", тем более, что производных классов предполагается много

A>(>100) и выглядеть это будет не очень наглядно и читабельно.

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

class A
{ public: int Foo(){return 0;}; };
class B : public A
{ public: int Boo(){return 1;}; };

template< class Base, class Derived >
struct    call_method_t
    {
        typedef int (Derived:: *pfn_t)();

        pfn_t    m_method;

        call_method_t( pfn_t method )
            :    m_method( method )
            {}

        void
        operator()( Base * a )
            {
                ((static_cast< Derived * >(a))->*m_method)();
            }
    };


int main()
{
    std::vector<A *> AV;

    std::for_each(AV.begin(), AV.end(), std::mem_fun<int,A>(&A::Foo)); // OK
    std::for_each(AV.begin(), AV.end(), call_method_t< A, B >( &B::Boo ) );
    return 0;
}
... << RSDN@Home 1.1.4 beta 3 rev. 185>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.