c++ - 可变参数模板包作为 std::unordered_map 的键

标签 c++ c++11 templates variadic-templates 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 类中为 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... 类型的组合,您可以使用,作为键类型,一个接收可变类型列表作为模板参数的类。正如评论中所建议的,std::tuple 是显而易见的选择

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

如果 Args... 中的某些类型一致,这也适用。

关于c++ - 可变参数模板包作为 std::unordered_map 的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48407259/

相关文章:

c++ - 从终端在 Linux 机器上用 C++ 创建并包含头文件

c++ - OpenSSL 静态库太大,有什么替代方法或方法可以减小它的大小吗?

c++ - ImageMagick 结果与 Magick++ 不同

c++11 - 特征对齐问题

c++ - 不透明和匿名枚举声明如何符合标准要求?

c++ - 从模板基类继承构造函数而不重复模板参数?

c++ - 最佳做法是在方法中传递参数

c++ - 在运行时使用函数转换类型列表

c++ - 解压一个类型列表

c++ - 从另一个模板类填充一个类的模板