Если вы хотите, чтобы ваш основной алгоритм выполнял специализированный алгоритм, между основным алгоритмом и специализированным алгоритмом должен быть какой-то контракт.
Если вы определяете этот контракт как интерфейс, ваш контейнерэто просто контейнер, содержащий указатели на эти интерфейсы, например:
class IAlgorithm
{
public:
virtual double operator()(double d) = 0;
};
typedef std::vector<IAlgorithm *> Algorithms;
Вызов случайного алгоритма - это просто получение размера вектора, принимая случайное значение от нуля до размера списка (0..size-1), принимая запись в этой позиции и вызывая интерфейс.
В качестве альтернативы вы также можете использовать новую конструкцию C ++ 0x std :: function, например:
#include <functional>
typedef std::function<double(double)> Algorithm;
typedef std::vector<Algorithm> Algorithms;
Взяв алгоритм аналогично, вы должны иметь возможность вызывать алгоритм, подобный следующему:
Algorithms myAlgorithms;
...
double myresult = myAlgorithms[2](mydouble);
Этот подход имеет то преимущество, что вы также можете использовать лямбда-выражения.
РЕДАКТИРОВАТЬ: Это пример, который использует лямбда.Он компилируется и работает, как и ожидалось, с Visual Studio 2010 (только что сам проверил):
#include <iostream>
#include <vector>
#include <functional>
typedef std::function<double(double)> Algorithm;
typedef std::vector<Algorithm> Algorithms;
int main()
{
Algorithms algorithms;
algorithms.push_back([](double d)->double{return d+d;});
algorithms.push_back([](double d)->double{return d*d;});
std::cout << algorithms[0](5) << std::endl;
std::cout << algorithms[1](5) << std::endl;
}