有没有一种方法可以使用可变参数模板作为Key模板参数std::unordered_map
?
我试图通过这种方式做到这一点:
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
需要单个键类型和单个值类型。
但是,如果您打算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...
一致,这也适用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句