gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:58:23 25 4
gpt4 key购买 nike

假设我想要像下面这样简单的东西:

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com