【发布时间】:2021-02-03 18:51:06
【问题描述】:
在我们的工作流程中,我们有几个整数 ID 字符串名称映射表(例如,状态/错误代码、硬件 ID 等)。我们正在努力寻找在 C++ 和 python 中为这些值编写双向查找库的最佳方法。
界面可能看起来像
namespace myproject{
namespace lookup{
typedef long ID_t;
enum class STATUSCODE :ID_t {OK=0, ERROR=1, UNKNOWN=-1};
std::string GetStatusDescription(ID_t statuscode);
ID_t GetStatusCode(const std::string& statusdesc);
enum class DEVICELABEL :ID_t {SuperThing_v1=0x234, LessSuperThing_v12=0x12};
std::string GetDeviceLabel(ID_t hardwareid);
ID_t GetHardwareID(const std::string& devicelabel);
}
}
#file myproject/lookup.py
class STATUSCODE(Enum):
OK=0
ERROR=1
UNKNOWN=-1
def GetStatusDescription(statuscode: int) -> str:
pass
def GetStatusCode(statusdesc: str) -> int:
pass
class DEVICELABEL(Enum):
SuperThing_v1=0x234
LessSuperThing_v12=0x12
def GetDeviceLabel(hardwareid: int) -> str:
pass
def GetHardwareID(devicelabel: str) -> int:
pass
理想情况下,实现应满足以下所有条件:
- 实际的表在单个文件中(或每个表一个文件,但没有像上例中的枚举那样重复)
- 使用整数、字符串和枚举输入提供高效的双向查找。例如。 python Enum 类是理想的。在 C++ 方面,我认为我们仍然坚持使用 enumstring 映射的预处理器技巧。枚举接口会很好,但不是必需的。
- C++ 接口应在编译时读取表以避免必须定位数据文件
查找表都很小,而且极不可能增长到足以让我们不得不担心驻留在内存中的程度。我们真的只关心找到一种好的 DRY 方式来存储和读取信息。我希望能够找到一种方法来格式化数据表,以便它可以被 python 和 C++ 编译器解析(可能在一些预处理器宏的帮助下)。 我们团队中没有人在为 C 函数或其他方式创建 python 绑定方面经验丰富,因此我们希望尽可能避免这条路线。但是,如果这确实是最好的方法,将不胜感激有关如何最好地实现它的建议(swig,boost::python?)。
【问题讨论】:
标签: python c++ enums bidirectional