gpt4 book ai didi

c++ - c++ 11中函数指针 vector 的初始化列表

转载 作者:太空宇宙 更新时间:2023-11-04 11:58:05 25 4
gpt4 key购买 nike

我正在尝试使用函数指针表对 DFA 进行编码。

该表由指向函数的函数指针填充,以输出某些内容或移动到表中的另一个状态,所有这些都基于机器接收到的输入。

现在我能做的是

function<token* ()> A1 = bind(A, &data);
function<token* ()> A2 = bind(B, &data);
function<token* ()> S1 = bind(S, 1);
function<token* ()> S2 = bind(S, 2);

vector< function<token* ()> > _table = { A1, A2, S1, S2 };

要创建一个 2x2“表”,其中 [0][0] 执行操作 A1,[0][1] 执行操作 A2,[1][0] 移至第 1 行,[1][1] 执行移动到第 2 行...等等。

我的问题是,在 C++11 中,有没有更快的方法来做到这一点?我的状态表已经增长到 60x150,我有 50 个不同的 Action 都绑定(bind)到不同的函数,我必须定义一个移位函数来到达每一行。

我试图在 C++11 的初始化功能中完成这一切,因此它是在编译时而不是在运行时完成的。

是否可以创建一个宏或类似的东西:

vector<function<token* ()> > S;
for(int i = 0; i < 60; i++){
function<token* ()> S[i] = bind(S, i);
}

以便之后我可以引用 S[3] 或其他任何内容,它会返回适当绑定(bind)的函数指针?

最佳答案

使用 Boost Preprocessor你可以很容易地做一些:

例如:

#include <vector>
#include <functional>
#include <boost/preprocessor/repetition.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>
struct token{};
token* S(int){return new token;}
#define MAKE_FUNCT(z, n, unused) \
BOOST_PP_COMMA_IF(n) \
std::bind(S, n) \

int main()
{
std::vector<std::function<token* ()>> table =
{BOOST_PP_REPEAT(10, MAKE_FUNCT, ~)};
}

这是一个 example ,传递 -E 标志我得到:

std::vector<std::function<token* ()>> table = { std::bind(S, 0) , std::bind(S, 1) , std::bind(S, 2) , std::bind(S, 3) , std::bind(S, 4) , std::bind(S, 5) , std::bind(S, 6) , std::bind(S, 7) , std::bind(S, 8) , std::bind(S, 9)};

关于c++ - c++ 11中函数指针 vector 的初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15281970/

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