gpt4 book ai didi

C++ 代码生成 : create a factory for function pointers

转载 作者:行者123 更新时间:2023-11-30 04:01:56 25 4
gpt4 key购买 nike

我有一个很长且稳定增长的(非成员)函数列表,我需要在运行时从这个列表中选择一个函数(基于命令行参数)。目前,我使用一个工厂函数来执行此操作,该函数接受一个字符串(函数的名称)并返回一个指向该函数的指针。然而,这意味着我每次添加新函数时都必须编辑工厂函数(这既烦人又违反了 DRY principle )。

我想通过解析函数列表的源代码以某种方式生成工厂函数(灵感来自于昨晚阅读 The Pragmatic Programmer 的代码生成部分)。然而,似乎很难正确解析 C++,我宁愿不让我的项目仅仅为此依赖 libclang。

所以我的问题是:如何在不引入重量级依赖的情况下在运行时按名称选择函数?

仅部分解析 C++ 代码是否“安全”(例如,仅使用正则表达式通过匹配看起来像一组函数参数的内容来提取函数名称)?

是否有任何其他(可移植且不太hacky)的方法可以在不手动编写选择代码的情况下执行此操作?

编辑:忘了说:我不允许使用 C++11,所以不幸的是没有 lambda 函数。

最佳答案

这是一个完整的示例:

#include <iostream>
#include <map>

namespace detail {
struct FuncPtrMap {
friend struct FuncPtrRegisterer;
using FuncPtr = void(*)();
static std::map<std::string, FuncPtr> const &getMap() {
return getWritableMap();
}

private:
// SIOF-proof singleton
static std::map<std::string, FuncPtr> &getWritableMap() {
static std::map<std::string, FuncPtr> theMap;
return theMap;
}
};

// Each static instance will register one function pointer
struct FuncPtrRegisterer {
FuncPtrRegisterer(FuncPtrMap::FuncPtr funcPtr, char const *funcName) {
FuncPtrMap::getWritableMap().emplace(funcName, funcPtr);
}
};
}

// Public access to the function pointers map
auto const &gFunctionPointersMap = detail::FuncPtrMap::getMap();

#define DO_CAT(A, B) A##B
#define CAT(A, B) DO_CAT(A, B)

// Registering macro : defines a static registerer
// with a (hopefully) unique name.
#define REGISTER_FUNC(NAME) detail::FuncPtrRegisterer \
CAT(fpreg, __COUNTER__) (&NAME, #NAME)


//
// Test
//

void myFunc1() {
std::cout << "func1\n";
}
REGISTER_FUNC(myFunc1);

void myFunc2() {
std::cout << "func2\n";
}
REGISTER_FUNC(myFunc2);

int main()
{
for(auto const &kv : gFunctionPointersMap) {
std::cout << "Calling " << kv.first << " : ";
kv.second();
}

return 0;
}

打印:

Calling myFunc1 : func1
Calling myFunc2 : func2

只需在您希望注册的每个函数之后放置一个REGISTER_FUNC(func)。您只需要函数的声明,而不是它的定义。请注意,这在头文件中不起作用。

之后,您可以随时从 main 开始访问 gFunctionPointersMap :)

编辑:C++03 版本 here (实际上没有太大变化)。

关于C++ 代码生成 : create a factory for function pointers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25488748/

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