提问者:小点点

变量模板包作为std::unordered_map的密钥


有没有办法在< code>std::unordered_map中使用variadic模板作为Key模板参数?

我尝试以这种方式执行此操作:

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

};

但是得到了这个错误:

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


共1个答案

匿名用户

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

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

但是,如果您的意图是在Wrapper类中为Args…中的每种类型都有一个hashmap,并且如果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,要访问它们,你必须显式显示相应的base结构;如下所示

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;
 }

相反,如果您需要一个带有所有< code >参数组合的键的< code>hashmap...类型,您可以将接收类型变量列表作为模板参数的类用作键类型。正如评论中建议的那样,< code>std::tuple是显而易见的选择

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

如果< code >参数中的某些类型...重合。

相关问题