gpt4 book ai didi

c++ - 使用函数指针自动填充 std::map

转载 作者:太空狗 更新时间:2023-10-29 21:48:45 26 4
gpt4 key购买 nike

我正在用 C++ 开发一种脚本语言,它使用解释器中“内置”的函数。我正在使用以下结构将函数名称映射到它们各自的指针:

typedef void(*BuiltInFunction)(Context*);
typedef std::unordered_map<std::string, BuiltInFunction> BuiltinFunctionsMap;

其中 Context 是自定义类。

然后我有这样的函数声明:

namespace BuiltIns {
void _f_print(Context* context);
void _f_error(Context* context);
void _f_readline(Context* context);
void _f_read(Context* context);
void _f_readchar(Context* context);
void _f_eof(Context* context);
...
}

最后是用实际指针填充映射的例程:

BuiltinFunctionsMap BuiltIns::populateFunctions() {
BuiltinFunctionsMap funcMap;
// Standard I/0
funcMap["print"] = &BuiltIns::_f_print;
funcMap["error"] = &BuiltIns::_f_error;
funcMap["readline"] = &BuiltIns::_f_readline;
funcMap["read"] = &BuiltIns::_f_read;
funcMap["readchar"] = &BuiltIns::_f_readchar;
funcMap["eof"] = &BuiltIns::_f_eof;
...
return funcMap;
}

我想问的是,是否有一种方法可以使用模板或类似的东西从函数声明中自动生成填充函数。目前,我使用的是正则表达式,这很简单,但每当我添加新功能时都必须这样做,而且很麻烦。

最佳答案

我不知道这是否真的是一个有用的答案,但您可以使用预处理器做一些事情 pretty squirrelly stuff :

#include <iostream>
#include <map>
#include <string>

class Context {};
typedef void (*BuiltInFunction)(Context*);

// a list of your function names
#define FN_NAMES \
X(foo) \
X(bar) \
X(baz)

// this declares your functions (you also have to define them
// somewhere else, e.g. below or in another file)
#define X(a) void _f_ ## a ## _print(Context *context);
namespace BuiltIns {
FN_NAMES
}
#undef X

// a global map initialized (using C++11's initializer syntax)
// to strings mapped to functions
#define X(a) {#a, &BuiltIns::_f_ ## a ## _print},
std::map<std::string, BuiltInFunction> g_fns = {
FN_NAMES
};
#undef X

int main() {
g_fns["foo"](NULL); // calls BuiltIns::_f_foo_print(NULL)
}

// (these have to be defined somewhere)
namespace BuiltIns {
void _f_foo_print(Context *context) {
std::cout << "foo\n";
}
void _f_bar_print(Context *context) {
std::cout << "bar\n";
}
void _f_baz_print(Context *context) {
std::cout << "baz\n";
}
}

这种方法的好处是可以自动生成例如字符串 "foo" 并将其绑定(bind)到 _f_foo_print 函数。不利之处在于可怕的预处理器欺骗以及您仍然必须在两个地方处理 foo 的事实。

关于c++ - 使用函数指针自动填充 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10075348/

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