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

我试图通过这种方式做到这一点:

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

};

但是出现了这个错误:

最佳答案



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

但是,如果您打算在hashmap类中为Wrapper中的每种类型都使用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>...
 { };

该解决方案的问题是,在相同的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...中的某些类型重合,这也可以工作。

关于c++ - 可变参数模板包作为std::unordered_map的键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48407259/

10-11 22:39
查看更多