可变参数模板包作为 std::unordered_map 的键
Variadic template pack as a key for std::unordered_map
有没有办法在std::unordered_map
中使用可变参数模板作为键模板参数?
我尝试以这种方式执行此操作:
template<typename T, typename ...Args>
class Wrapper {
public:
// some staff
private:
unordered_map<Args, T> hashmap;
};
但是得到这个错误:
错误 C3520"Args":必须在此上下文中扩展参数包
有没有办法在 std::unordered_map 中使用可变参数模板作为键模板参数?
不,据我所知: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>...
{ };
这个解决方案的问题在于你在同一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;
}
相反,如果您需要一个具有所有Args...
类型组合的键的单个hashmap
,则可以使用接收可变参数类型列表的类作为键类型。正如评论中所建议的,std::tuple
是显而易见的选择
std::unordered_map<std::tuple<Args...>, T> hashmap;
如果Args...
中的某些类型重合,这也有效。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用字符数组作为 Map 中的键
- C++如何创建 std::map
- C++ equivalent to Java Map getOrDefault?
- 从其他容器中移动构造"std::map"
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- unordered map -在c++ std::unordered_map中预分配桶