【发布时间】:2017-11-18 09:02:35
【问题描述】:
问题: 在我的系统中,有很多统计计算器被包装成类。我的工作是将这些计算器的值组合成一个名为“总计”的值。
解释如何组合这些计算器的“模型”以表格形式给出 --- csv 文件或 MySQL 中的表格
instance_name,accessor,argument,post_processing_function_name
fleet_statistics,getCash,2017,func1
city_statistics,getPopulation,2016,func2
....
....
我目前的解决方案:我编写了一个 python 脚本来读取 csv 文件并生成这样的 c++ 代码:
double computeTotal()
{
double total = 0;
total += func1(fleet_statistics->getCash(2017));
total += func2(city_statistics->getPopulation(2016));
....
....
}
使用python生成代码很方便,但问题是,它不再是一个“纯”的c++程序。我需要修改 makefile 以确保生成的 c++ 文件是最新的。
更优雅的解决方案是使用元编程在 c++ 中生成代码,使用 c++ 而不是 python。谁能告诉我如何做到这一点?
只提几点:
CSV 文件是由一些与业务逻辑相关的脚本生成的。它有几千行。手动编写c++代码是不可能的。
每次发布新版本时,CSV 文件都会发生变化。
我以 CSV 格式为例。如果这会让事情变得更容易,它可能是 MySQL 中的一个表
instance_name 列中的对象不一定来自同一个 BaseClass。访问器的函数签名也是变体的。所以用函数指针不方便
谢谢!
【问题讨论】:
-
你能改变输入 csv 的格式,还是给定的?
-
这感觉像是一个 XY 问题。你真的需要元编程吗?为什么不定义一个包含一些函数指针的 C++ 数据结构呢?或者为什么不直接手动编写代码?您是在询问有关您提出的解决方案的问题,而不是真正说出问题所在。
-
更重要的是,您为什么要更改现有的解决方案? makefile 中包含的代码生成有什么问题?为什么称其为“黑客”?可能很难调试,这是肯定的,但它工作正常吗? “纯 C++”是一个毫无意义的要求。为艺术而艺术。
-
为什么这个 CSV 文件首先存在?如果有人每周对其进行编辑,他们就不能改为编辑 C++ 代码吗?
-
重复 Davids 的问题,为什么需要元编程?据我所见,您需要一个数据库。硬编码一千行数据听起来是错误的。尤其是它经常变化。每次使用程序时都不应要求重新编译。
标签: c++ templates metaprogramming