Boost如何为类型选择创建地图?

| 所以我用BOOST.EXTENTION加载模块。我有一个描述每个模块的特殊文件。我从该文件读取变量。 这样的例子:
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
中提取实型。问题重演。而且,如果您知道真实的类型,您还可以制作一个变体/工会并为自己省下7英镑的麻烦。 现在,对于另一个麻烦的事情:
m.get<myMap[\"TYPE_1_IN_STRING_FORM\"], myMap[\"TYPE_2_IN_STRING_FORM\"]>
为了使上述代码行有效,您需要C ++不具备的两个功能:返回类型和运行时模板的功能。让我们暂时忽略第一点。 模板是编译时的,“ 9”函数就是这样的模板。现在,要使用该模板,您的
myMap
将需要能够在编译时返回类型,同时在运行时进行填充。看到矛盾了吗?这就是为什么需要运行时模板。 令人遗憾的是,在C ++中,运行时恰好不可能实现这三件事(或非常困难且非常非常有限):异构数据类型(无固定大小),返回类型和模板。 涉及类型的所有事情都需要在编译时完成。 @Gman发表的这篇博文与该问题有些相关。如果您想知道C ++不能做什么,那么绝对值得一读。 因此,总结一下:您将需要重新考虑并重构您的问题和解决方案。 :|     

要回复问题请先登录注册