【发布时间】:2014-08-25 14:57:11
【问题描述】:
我有一个长期且稳定增长的(非成员)函数列表,我需要在运行时从该列表中选择一个函数(基于命令行参数)。目前,我使用一个工厂函数来执行此操作,该函数接受一个字符串(函数的名称)并返回一个指向函数的指针。然而,这意味着我每次添加新函数时都必须编辑工厂函数(这既烦人又违反了DRY principle)。
我想通过解析函数列表的源代码以某种方式生成工厂函数(灵感来自昨晚阅读The Pragmatic Programmer 的代码生成部分)。然而,正确解析 C++ 似乎非常困难,我宁愿不让我的项目仅仅为此而依赖 libclang。
所以我的问题是:如何在运行时按名称选择函数而不引入重量级依赖项?
仅部分解析 c++ 代码是否“安全”(例如,仅使用正则表达式通过匹配看起来像一组函数参数的内容来提取函数名称)?
是否有任何其他(便携且不太老套)无需手动编写选择代码的方式来做到这一点?
编辑:忘了说:我不允许使用 C++11,所以很遗憾没有 lambda 函数。
【问题讨论】:
-
所有函数都具有相同的签名吗?
-
使用
map<string,void*>(或funcptr typedef)来存储名称和地址。 -
@Quentin 是的,所以提取函数名称不会太难......但这是个好主意吗?
-
@SHR 这比我现在做的要好。但是,它仍然需要在多个地方写出函数名称,对吧?
-
您可以看看 google-gtest 或其他框架如何在链接时使用自动类注册(即stackoverflow.com/q/9975672/847349、stackoverflow.com/q/13824375/847349)。问题在于 MSVC 中的链接器优化会抛出无法从
main访问的类型。
标签: c++ function-pointers c++03