假设我想要一些简单的东西,如下所示:
我有一个核心算法,它随机选择一种专用算法(在编译时专用)并处理该算法。这些专门的算法是通过仿函数实现的。
现在的问题是:如何实现一个在编译时构建的容器,其中核心算法可以首先检查该容器的大小(“我有 4 个算法 ->需要随机选择算法 0-3”),然后可以执行该容器中的仿函数(“随机选择 2 -> 处理容器中的第三个仿函数”)。
如何尽可能简单地实现它?我想这是可能的。
与奇怪的重复出现的模板习惯有任何联系吗? ( wiki link )
使用Boost::Fusion有简单的方法吗? (official doc)
编辑:所有算法都将在核心算法中使用。使用模式(随机数)是运行时决定(所以我不需要编译时随机数)。该算法只需知道仿函数的容器以及该容器的大小即可安全访问。
最佳答案
如果您希望核心算法执行专用算法,则核心算法和专用算法之间应该存在某种契约。
如果您将此合约定义为接口(interface),则您的容器只是一个包含指向这些接口(interface)的指针的容器,例如:
class IAlgorithm
{
public:
virtual double operator()(double d) = 0;
};
typedef std::vector<IAlgorithm *> Algorithms;
调用随机算法只是简单地获取 vector 的大小,获取零和列表大小 (0..size-1) 之间的随机值,获取该位置的条目并调用接口(interface)。
或者,您也可以使用新的 C++0x std::function 构造,如下所示:
#include <functional>
typedef std::function<double(double)> Algorithm;
typedef std::vector<Algorithm> Algorithms;
采取类似的算法,你应该能够调用这样的算法:
Algorithms myAlgorithms;
...
double myresult = myAlgorithms[2](mydouble);
这种方法的优点是您还可以使用 lambda。
编辑:这是一个使用 lambda 的示例。它可以在 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;
}
关于c++ - 用于控制算法的仿函数的编译时容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4132558/