有没有办法在< code>std::unordered_map中使用variadic模板作为Key模板参数?
我尝试以这种方式执行此操作:
template<typename T, typename ...Args>
class Wrapper {
public:
// some staff
private:
unordered_map<Args, T> hashmap;
};
但是得到了这个错误:
错误C3520“Args”:参数包必须在此上下文中展开
有没有方法在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 >参数中的某些类型...重合。