增强如何为类型选择创建映射

Boost how to create a map for types selection?

本文关键字:选择 创建 映射 类型 增强      更新时间:2023-10-16

所以我使用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++ 不能做什么,这绝对值得一读。


所以,总结一下:你需要重新思考和重构你的问题和解决方案。: |