1

所以我使用 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();

能停下来吗?所以只要我们想要的所有类型都在其中声明,我们就不会关心?

4

1 回答 1

1

为此,您需要一个异构映射——也就是说,它的元素可以是不同的类型。此外,您需要能够从函数返回类型,而不仅仅是变量。


Boost.Variant现在,使用或 simple可以实现异构映射union,但这会将其绑定到编译时间:我们需要知道可能创建该变体/联合的每种类型。
当然 aBoost.Any可以存储所有内容及其狗,但问题再次出现:您需要再次从中提取真实类型Boost.Any。问题重演。如果你知道真正的类型,你也可以做一个变体/联合,省去any_cast麻烦。


现在,为了另一个麻烦的事情:

m.get<myMap["TYPE_1_IN_STRING_FORM"], myMap["TYPE_2_IN_STRING_FORM"]>

要使上面的行工作,您需要 C++ 没有的两个功能:返回类型运行时模板的能力。让我们暂时忽略第一点。
模板是compile-timeget函数就是这样的模板。现在,要使用该模板,您myMap需要能够在compile-time返回类型,同时在runtime填充。看到矛盾了吗?这就是需要运行时模板的原因。


可悲的是,这三件事在 C++ 运行时是不可能的(或非常困难且非常有限):异构数据类型(没有常量大小)、返回类型模板
涉及类型的一切都需要在编译时完成。@Gman的这篇博文与这个问题有些相关。如果您想知道 C++不能做什么,这绝对值得一读。


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

于 2011-04-17T15:33:00.157 回答