【问题标题】:C++ typedef a std::pair and then use the typedef to declare a mapC++ typedef a std::pair 然后使用 typedef 声明一个映射
【发布时间】:2016-04-23 05:51:06
【问题描述】:

假设我有这个 typedef

typedef std::pair<std::string, uint32_t> MyType;

那么,如果我也想使用 MyType 创建地图,我该怎么做呢?

我不想重新键入这对中的两种类型,例如:

map<std::string, uint32_t> myMap;

我想要类似的东西:

map<MyType's first type, MyType's second type> myMap;

有没有办法使用我的 typedef MyType 而不是重新键入类型来做到这一点?

【问题讨论】:

    标签: c++ dictionary typedef std-pair


    【解决方案1】:

    简单...

    std::map<MyType::first_type, MyType::second_type> myMap;
    

    http://en.cppreference.com/w/cpp/utility/pair

    coliru

    处的示例程序

    【讨论】:

    • 啊,这就是您在类型上使用成员类型的方式。我尝试使用点和箭头运算符但没有用...大声笑非常感谢。 (需要等待 2 分钟才能接受它作为答案)
    • 但这确实取决于MyType 是一个std::pair。如果这是真正问题的简化版本,则 OP 将需要提出另一个问题(他们很可能不走运)。该语言没有提供内省 typedef 的通用方法,必须依赖 typedef 的类型来提供一种机制。
    • @MartinBonner 我的问题实际上是简单的配对情况。 :)
    • 只是为了记录,地图不会包含这样的对!相反,它将包含pair&lt;string const,uint32_t&gt;,因为第一个(键)存储为常量。
    【解决方案2】:

    如果您要对许多不同的类型执行此操作,您可以设置一个别名声明

    template <typename T>
    using pair_map = std::map< typename T::first_type, typename T::second_type>;
    
    typedef std::pair<std::string, int> MyType;
    
    pair_map<MyType> my_map;
    

    这至少需要 c++11。

    【讨论】:

      【解决方案3】:

      当您使用一对时,它相当于一个属性。 Pair 就像派生的数据类型。当您在 map 中使用一对时,它会根据您的声明被视为键或值。但是一对的第一个和第二个对象不能是映射中的键和值。您可以分别对这两种数据类型使用 typedef 并使用快捷方式或如上一个答案中所述。而不是重复写“std::”,你可以使用 使用命名空间标准;谢谢。

      【讨论】:

      • 可以使用using namespace std;,但仅仅因为你可以,并不意味着它是一个好主意。见stackoverflow.com/questions/1452721/…
      • 我不知道。感谢您提供信息@MartinBonner
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多