Variadic模板包作为std :: unordered_map的键

时间:2018-01-23 17:08:40

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

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

我试着这样做:

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

};

但得到了这个错误:

  

错误C3520&#39; Args&#39;:参数包必须在此上下文中展开

1 个答案:

答案 0 :(得分:1)

  

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

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

但是,如果您的目的是在hashmap课程中WrapperArgs...中的每种类型,并且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>...
 { };

此解决方案的问题在于,您在同一hashmap中有更多class并且要访问它们,您必须明确相应的基础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...类型的组合,那么您可以使用一个接收可变列表的类作为键类型类型作为模板参数。正如评论中所建议的,std::tuple是明显的选择

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

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