可变参数模板包作为std :: unordered_map的键

多芬13

有没有一种方法可以使用可变参数模板作为Key模板参数std::unordered_map

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

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

};

但是出现了这个错误:

错误C3520'Args':必须在这种情况下扩展参数包

最高66

在std :: unordered_map中是否可以使用可变参数模板作为Key模板参数?

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

但是,如果您打算hashmapWrapper类中为中的每个类型使用一个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...一致,这也适用

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何实现std :: unordered_map

以值作为参考的unordered_map

std :: unordered_map的哈希值

使用两个对象作为unordered_map或替代项的哈希键

创建一个以std :: pair为键的std :: unordered_map

在std :: unordered_map中使用模板键

std :: unordered_map不释放内存

std :: unordered_map指针/引用无效

同一个键,std :: unordered_map有多个条目?

使用对作为键的unordered_map构建失败(C ++)

使用QString作为std :: unordered_map中的键

C ++哈希表-如何解决自定义数据类型作为键的unordered_map的冲突?

为什么std :: map接受std :: pair作为键,而std :: unordered_map不接受?

为CString创建unordered_map作为键

std :: unordered_map :: insert与std :: unordered_map :: operator []

迭代合并std :: unordered_map

std :: unordered_map:多线程插入?

如何通过std :: unordered_map <std :: wstring,T>中的std :: wstring_view类型的键查找?

std :: unordered_map中的键与哈希

std :: reduce with std :: unordered_map

函数参数中的unordered_map

将nullptr用作std :: unordered_map的键是否有任何后果?

如何直接将键用作std :: unordered_map的哈希?

模板变量作为unordered_map键,迭代器存在问题

std :: ofstream的unordered_map

C ++-在unordered_map中使用多个值作为键的最佳方式

将迭代器作为键的unordered_map,将迭代器强制转换为long long?

这种方法是否不利于在 std::unordered_map 中使用 2D 坐标作为键?

std::make_pair、std::unordered_map 和从键类型使用移动构造函数