c++ - 用于控制算法的仿函数的编译时容器?

标签 c++ generic-programming boost-fusion template-meta-programming

假设我想要一些简单的东西,如下所示:

我有一个核心算法,它随机选择一种专用算法(在编译时专用)并处理该算法。这些专门的算法是通过仿函数实现的。

现在的问题是:如何实现一个在编译时构建的容器,其中核心算法可以首先检查该容器的大小(“我有 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/

相关文章:

c++ - C++ 中指针运算的 a+i 和 &a[i] 有什么区别?

c# - 流是什么意思?它的特点是什么?

c++ - boost::adaptors::strided 不能在boost::adaptors::transformed 之后使用?

c++ - 有没有办法告诉 C++ 中指针实际指向什么类型

c++ - 将adt_proxy类型替换为值类型时的Boost fusion 错误

c++ - 我可以在不创建自己的 Docker 镜像的情况下在 Gitpod 中加载其他库吗?

scala - 标记案例类上的 LabelledGeneric 实例生成使我在无形中产生错误

c - 在同一个地方定义多个函数

c++ - 如何在运行时将值推回 fusion vector ?

c++ - 使定义/包含生成的结构适应 boost::fusion