【问题标题】:Boost how to create a map for types selection?Boost如何为类型选择创建地图?
【发布时间】:2011-08-07 08:18:28
【问题描述】:

所以我 use BOOST.EXTENTION 加载模块。我有一个描述每个模块的特殊文件。我从该文件中读取变量。

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

如何创建这样的地图来映射标准和服装类型?

更新:

可能与variant:

  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();

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

【问题讨论】:

    标签: c++ boost types map boost-extension


    【解决方案1】:

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


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


    现在,还有一件麻烦的事情:

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

    要使上述线路正常工作,您需要 C++ 不具备的两个功能:返回类型运行时模板。让我们暂时忽略第一点。
    模板是compile-timeget 函数就是这样一个模板。现在,要使用该模板,您的myMap 需要能够在编译时 返回类型,同时在运行时 填充。看到矛盾了吗?这就是需要运行时模板的原因。


    遗憾的是,这三件事在 C++ 运行时是不可能的(或极其困难且非常有限):异构数据类型(没有固定大小),返回类型模板
    所有涉及类型的事情都需要在编译时完成。 @Gman 的This blogpost 与该问题有些相关。如果您想了解 C++ 的不能做什么,那绝对值得一读。


    因此,总结一下:您需要重新思考和重构您的问题和解决方案。 :|

    【讨论】:

    • 所以.. 如果我想要有限的类型支持,boos::variant 可以解决问题吗? (见帖子更新)
    • @Blender : boost.fusion 包含异构映射,但它们从异构类型映射到值,而不是从同构值映射到异构类型。
    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多