增强如何为类型选择创建映射
Boost how to create a map for types selection?
所以我使用BOOST。加载模块的扩展。我有一个描述每个模块的特殊文件。我从那个文件中读取变量
so such example:
shared_library m("my_module_name");
// Call a function that returns an int and takes a float parameter.
int result = m.get<int, float>("function_name")(5.0f);
m.close();
对我来说会变成:
shared_library m("my_module_name");
// Call a function that returns an int and takes a float parameter.
int result = m.get<myMap["TYPE_1_IN_STRING_FORM"], myMap["TYPE_2_IN_STRING_FORM"]>("function_name")(5.0f);
m.close();
如何创建这样的地图,将映射标准和服装类型?
更新:
可能与变体:
shared_library m("my_module_name");
int result = m.get<boost::variant< int, float, ... other types we want to support >, boost::variant< int, float, ... other types we want to support > >("function_name")(5.0f);
m.close();
想买可以吗?所以只要我们想要的所有类型都声明在里面,我们就不会在意了?
为此,您需要一个异构映射—也就是说,它的元素可以是不同的类型。此外,您还需要能够从函数返回类型,而不仅仅是变量。
现在,可以使用Boost.Variant
或简单的union
来创建异构映射,但这会将其绑定到编译时间:我们需要知道可能创建该变体/联合的每种类型。
当然,Boost.Any
可以存储所有内容及其狗,但问题再次出现:您需要再次从Boost.Any
中提取实际类型。这个问题反复出现。如果你知道真正的类型,你也可以创建一个变体/联合,从而省去any_cast
的麻烦。
现在,对于另一个麻烦的事情:
m.get<myMap["TYPE_1_IN_STRING_FORM"], myMap["TYPE_2_IN_STRING_FORM"]>
要使上面的行工作,您需要c++不具备的两个特性:返回类型和运行时模板的能力。让我们暂时忽略第一点。
模板是编译时的, get
函数就是这样一个模板。现在,要使用该模板,您的myMap
需要能够在编译时返回类型,同时在运行时进行填充。看到矛盾了吗?这就是为什么需要运行时模板。
遗憾的是,这三件事在c++运行时是不可能的(或者非常困难和非常非常有限):异构数据类型(没有常量大小),返回类型和模板。涉及类型的所有内容都需要在编译时完成。@Gman的这篇博文在某种程度上与这个问题有关。如果你想知道c++ 不能做什么,这绝对值得一读。
所以,总结一下:你需要重新思考和重构你的问题和解决方案。: |
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 如何在C++中创建数字列表,以便它可以选择一个随机数?
- 这是使用C/C 创建和存储周期的最好的选择
- 如何在Qt中创建自定义颜色选择器
- Qt C++根据组合框中的选择创建一个对象
- C++数组选择平方数并创建新向量
- 分割后,如何创建掩码来选择分割类
- Qt Creator在创建新项目时没有"Qt Gui Application"可供选择
- 如何创建一个根据概率选择数字的函数
- 从C++中的屏幕选择创建位图时的黑色图像
- 选择创建公共函数或类私有成员函数
- Qt:创建自定义 QTextCursor 选择
- 是否可以创建一个函数来比较对象向量中动态选择的变量
- 选择一个垫子的子集并复制它们以在C++/Opencv中创建一个新垫子
- 努力创建一个函数,将用户输入存储到任意选择的向量(使用c++)
- 创建一个有三种方法可供选择的加密程序!它有问题,我不知道如何解决
- 如何从另一个仅静态选择满足特定类型规则的索引的元组实例创建元组实例
- OpenGL上下文创建从不选择像素格式
- 增强如何为类型选择创建映射