Здравствуйте, 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>>