c++11中函数指针向量的初始化列表
Initialization list for vector of function pointers in c++11
我正在尝试使用函数指针表编写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个不同的操作都绑定到不同的函数,我必须定义一个移位函数来访问每一行。
我试图在c++ 11的初始化功能中完成这一切,因此它是在编译时而不是在运行时完成的。
是否可以创建一个宏或执行如下操作:
vector<function<token* ()> > S;
for(int i = 0; i < 60; i++){
function<token* ()> S[i] = bind(S, i);
}
之后,我可以引用S[3]
或其他什么,它给了我适当的绑定函数指针?
使用Boost预处理器您可以轻松地制作一些:
例如:#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, ~)};
}
这里是一个例子,传递-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++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- std::map与谓词与初始化列表
- 类内初始化与构造函数初始化列表的顺序
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++初始化列表与分配值
- C++初始化列表中的向量集大小或调整大小
- 在构造函数初始化列表中使用 std::variant
- emplace_back初始化列表错误,当初始化列表在独立变量上工作时
- 解释了构造函数成员初始化列表
- 使用初始化列表时如何获取私有数据?
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 如何在成员初始化列表中声明共享指针
- 庞大的初始化列表,如何修复"fatal error C1060: compiler is out of heap space"
- 我可以检查初始化列表中设置的构造函数主体中的变量吗
- 使用整数初始化列表初始化长双精度的向量
- 是否可以在C++中使用初始化列表设置数组的特定成员?