可变参数模板包作为 std::unordered_map 的键
Variadic template pack as a key for std::unordered_map
有没有办法在 std::unordered_map
中使用可变参数模板作为 Key 模板参数?
我试过这样做:
template<typename T, typename ...Args>
class Wrapper {
public:
// some staff
private:
unordered_map<Args, T> hashmap;
};
但是出现这个错误:
Error C3520 'Args': parameter pack must be expanded in this context
Is there a way to use a variadic template as a Key template parameter in std::unordered_map?
不,据我所知:std::unordered_map
需要单一键类型和单一值类型。
但是,如果您打算在 Wrapper
class 中为 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>...
{ };
这个解决方案的问题是你在同一个 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;
}
相反,如果您需要一个 hashmap
和一个组合了所有 Args...
类型的键,您可以使用 class 作为键类型接收类型的可变列表作为模板参数。正如评论中所建议的那样,std::tuple
是显而易见的选择
std::unordered_map<std::tuple<Args...>, T> hashmap;
如果 Args...
中的某些类型一致,这也适用。
有没有办法在 std::unordered_map
中使用可变参数模板作为 Key 模板参数?
我试过这样做:
template<typename T, typename ...Args>
class Wrapper {
public:
// some staff
private:
unordered_map<Args, T> hashmap;
};
但是出现这个错误:
Error C3520 'Args': parameter pack must be expanded in this context
Is there a way to use a variadic template as a Key template parameter in std::unordered_map?
不,据我所知:std::unordered_map
需要单一键类型和单一值类型。
但是,如果您打算在 Wrapper
class 中为 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>...
{ };
这个解决方案的问题是你在同一个 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;
}
相反,如果您需要一个 hashmap
和一个组合了所有 Args...
类型的键,您可以使用 class 作为键类型接收类型的可变列表作为模板参数。正如评论中所建议的那样,std::tuple
是显而易见的选择
std::unordered_map<std::tuple<Args...>, T> hashmap;
如果 Args...
中的某些类型一致,这也适用。