Самый простой способ вызвать функции-члены для всего набора элементов в вашем контейнере - это использовать for_each
:
using namespace std;
using namespace std::tr1;
vector<T> cont;
// ...
for_each( cont.begin(), cont.end(),
bind( &T::foo, 42 ) );
// assume void T::foo(int); exists
Если у вас нет tr1
, вы можете использовать:
for_each( cont.begin(), cont.end(),
bind2nd( mem_fun( &s::foo ), 42 ) // first parameter is the object itself
);
Хотя я не уверен, чего вы здесь добиваетесь. У вас есть как полиморфизм времени компиляции (он же шаблоны), так и полиморфизм времени выполнения (он же virtual
функции-члены). Дизайн кажется слишком сложным. На самом деле достаточно следующего определения:
int Execute()
{
int count = 0;
for( int i=0; i< MyArraySize; ++i ){
MyArray[ i ]->Foo(); // assume virtual int A::Foo(); exists
++count;
}
return count;
}
Однако, как вы, возможно, уже поняли, virtual
члены должны иметь одинаковую подпись для переопределения в подклассах (иначе вы перегружаете функцию).
Обратите внимание, что образец GetItems
не вызывает функцию-член содержащихся объектов, он вызывает член, а именно push_back
для объекта-контейнера vector
.
Если все, что вы хотите сделать, это скопировать указатели из массива vanilla в vector
, вы можете использовать специализированный ctor vector
, который принимает два итератора:
template<class T>
vector<T*> GetItems() // <-- This is the problem function
{
return vector<T*>( &MyArray[ 0 ], &MyArray[ 0 ] + MyArraySize );
}