【问题标题】:How do I instantiate and access boost mpl types?如何实例化和访问 boost mpl 类型?
【发布时间】:2014-10-01 02:34:49
【问题描述】:

所以我构建了我的 boost::mpl::map 对象,其中包含一些键和类型的混合。我现在想实例化地图的一个实例,这样我就有了地图中每个type 的实例:

using namespace boost::mpl;
using MyMap = map<
  pair<int, double>,
  pair<double, double>,
  pair<bool, int>>;

int main()
{
  // create the map:
  MyMap myMap;
  // now I want a reference to the element indexed by "int"
  using RefType = at<MyMap, int>::type&;

  RefType myRef(myMap); // compile error!
}

我遇到的错误类似于:

错误:无法将 'MyMap {aka map<...>} 转换为 blarghh {aka int}

显然我应该得到某种“索引”值(也许是boost::mpl::map::order?)。那么如何实际访问(即获取引用)这些关联mpl 容器中的元素?另外,关于如何(具体地)完成此操作的文档在哪里?

【问题讨论】:

    标签: c++ boost boost-mpl


    【解决方案1】:

    您的代码有一些问题:

    • 没有#includes。缺少&lt;boost/mpl/at.hpp&gt; 是个问题。
    • 地图中的对之间没有逗号。
    • 您正在尝试将地图创建为一个值,这没有任何意义。我不知道如何看待MyMap myMap。您通常不会实例化 MPL 类型。

    此代码有效,希望它大致是您想要的。

    #include <boost/mpl/map.hpp>
    #include <boost/mpl/at.hpp>
    
    using namespace boost::mpl;
    using MyMap = map<
      pair<int, double>,
      pair<double, double>,
      pair<bool, int>>;
    
    int main()
    {
      using RefType = at<MyMap, int>::type&;
    
      double foo;
      RefType myRef(foo);
    }
    

    【讨论】:

    • 抱歉,我修正了缺少的逗号。我想实例化地图,以便我有一组所有types 实例化,然后我想引用其中一个值(为了这个例子)。 std 等效项可能正在创建 tuple 的实例化并获取对其实例化类型之一的引用。这有意义吗?据我了解,您的示例只是创建了一个 double 和一个对它的引用。
    • 我在想也许我需要增强融合来解决这个问题?在这种情况下,我的下一个问题是;如何将我的 boost::mpl::map 转换为 boost::fusion::map 然后我可以实例化?
    • 您要实现的更高层次的目标是什么?我很难理解您为什么需要{type: default-constructed-other-type} 的地图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多