【问题标题】:Variadic template pack as a key for std::unordered_map可变参数模板包作为 std::unordered_map 的键
【发布时间】:2018-07-02 14:23:49
【问题描述】:

有没有办法在std::unordered_map 中使用可变参数模板作为 Key 模板参数?

我尝试过这样做:

template<typename T, typename ...Args>
class Wrapper {
public:
    // some staff
private:
    unordered_map<Args, T> hashmap;

};

但是得到了这个错误:

错误 C3520 'Args':参数包必须在此上下文中展开

【问题讨论】:

  • 你想达到什么目的?
  • 使用可变参数模板作为键到底是什么意思?键必须是类型,您可以实例化对象。您不能实例化类型为可变参数包的对象。最接近的是元组。你想要一个以元组为键的 unordered_map 吗?
  • std::tuple 呢?
  • 如果元组键是您想要的,那么将它们用作哈希映射中的键需要一点(不是太多)工作:stackoverflow.com/questions/20834838/…。
  • unordered_map&lt;T, tuple&lt;Args...&gt;&gt; hashmap;

标签: c++ c++11 templates variadic-templates unordered-map


【解决方案1】:

有没有办法在 std::unordered_map 中使用可变参数模板作为 Key 模板参数?

不,据我所知:std::unordered_map 需要一个键类型和一个值类型。

但是如果你的意图是在Wrapper类中拥有一个hashmap,对于Args...中的每个类型,如果Args...类型都不同,你可以通过另一个继承和另一个包装级别

template <typename K, typename V>
struct wrpH
 { std::unordered_map<K, V> hashmap; };

template <typename T, typename ...Args>
class Wrapper : public wrpH<Args, T>...
 { };

此解决方案的问题是您在同一个class 中有更多hashmap,并且要访问它们,您必须显式地显示相应的基struct;如下

w.wrpH<Args, T>::hashmap[argsValue] = tValue;

以下是一个完整的工作示例

#include <iostream>
#include <unordered_map>

template <typename K, typename V>
struct wrpH
 { std::unordered_map<K, V> hashmap; };

template <typename T, typename ...Args>
class Wrapper : public wrpH<Args, T>...
 { };

int main()
 {
   Wrapper<int, int, long, long long>  w;

   w.wrpH<long, int>::hashmap[1L] = 2;

   std::cout << w.wrpH<int, int>::hashmap.size() << std::endl;
   std::cout << w.wrpH<long, int>::hashmap.size() << std::endl;
   std::cout << w.wrpH<long long, int>::hashmap.size() << std::endl;
 }

相反,如果您需要单个 hashmap 的键是所有 Args... 类型的组合,则可以使用接收可变类型列表作为模板参数的类作为键类型.正如 cmets 中所建议的,std::tuple 是显而易见的选择

std::unordered_map<std::tuple<Args...>, T> hashmap;

如果Args... 中的某些类型重合,这也有效。

【讨论】:

  • 我需要一个hashmap,其键是所有Args... 类型的组合。所以tuple 的解决方案对我有用。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 2012-07-09
  • 2020-04-29
相关资源
最近更新 更多