如何在 unordered_map 中使用变体作为键?
How to use variants as the key in unordered_map?
如何使用变体作为 unordered_map 中的键?
例如,我想让下面的代码工作。
using VariantType = std::variant<int, std::string, unsigned int>;
std::unordered_map<VariantType, int, $some_hash_function$> m;
如何实施 $some_hash_function$?
变体已经有哈希模板特化:
http://en.cppreference.com/w/cpp/utility/variant/hash
唯一的条件是变体中的每个类型都必须有一个哈希函数:
The specialization std::hash<std::variant<Types...>>
is enabled (see std::hash) if every specialization in std::hash<std::remove_const_t<Types>>...
is enabled, and is disabled otherwise.
但是您的所有变体类型都有默认哈希,因此对于您的变体类型,它编译时没有第三个参数,因为标准哈希有效。但是,如果您的变体中的类型没有散列函数(或 == 运算符),那么它将无法编译并出现此错误:
error: static assertion failed: hash function must be invocable with an argument of key type
回到你的问题:
当变体类型具有哈希函数时:
#include <variant>
#include <unordered_map>
#include <string>
#include <iostream>
using VariantType = std::variant<int, std::string, unsigned int>;
std::unordered_map<VariantType, int> m =
{
{1, 1},
{2u, 2},
{std::string("string"),3}
};
int main()
{
VariantType v = std::string{"string"};
std::cout << m[v];
}
你得到这个输出:
Program returned: 0
Program stdout
3
当并非所有变体类型都具有哈希函数时:
#include <variant>
#include <unordered_map>
#include <string>
#include <iostream>
class UnhashedClass {};
using VariantType = std::variant<UnhashedClass, int, std::string>;
std::unordered_map<VariantType, int> m =
{
{1, 1},
{2u, 2},
{std::string("string"),3}
};
int main()
{
VariantType v = std::string{"string"};
std::cout << m[v];
}
你得到这个输出:
Could not execute the program
Compiler returned: 1
Compiler stderr
...
error: static assertion failed: hash function must be invocable with an argument of key type
...
你可以在这里自己试一下:
如何使用变体作为 unordered_map 中的键?
例如,我想让下面的代码工作。
using VariantType = std::variant<int, std::string, unsigned int>;
std::unordered_map<VariantType, int, $some_hash_function$> m;
如何实施 $some_hash_function$?
变体已经有哈希模板特化:
http://en.cppreference.com/w/cpp/utility/variant/hash
唯一的条件是变体中的每个类型都必须有一个哈希函数:
The specialization
std::hash<std::variant<Types...>>
is enabled (see std::hash) if every specialization instd::hash<std::remove_const_t<Types>>...
is enabled, and is disabled otherwise.
但是您的所有变体类型都有默认哈希,因此对于您的变体类型,它编译时没有第三个参数,因为标准哈希有效。但是,如果您的变体中的类型没有散列函数(或 == 运算符),那么它将无法编译并出现此错误:
error: static assertion failed: hash function must be invocable with an argument of key type
回到你的问题:
当变体类型具有哈希函数时:
#include <variant>
#include <unordered_map>
#include <string>
#include <iostream>
using VariantType = std::variant<int, std::string, unsigned int>;
std::unordered_map<VariantType, int> m =
{
{1, 1},
{2u, 2},
{std::string("string"),3}
};
int main()
{
VariantType v = std::string{"string"};
std::cout << m[v];
}
你得到这个输出:
Program returned: 0
Program stdout
3
当并非所有变体类型都具有哈希函数时:
#include <variant>
#include <unordered_map>
#include <string>
#include <iostream>
class UnhashedClass {};
using VariantType = std::variant<UnhashedClass, int, std::string>;
std::unordered_map<VariantType, int> m =
{
{1, 1},
{2u, 2},
{std::string("string"),3}
};
int main()
{
VariantType v = std::string{"string"};
std::cout << m[v];
}
你得到这个输出:
Could not execute the program
Compiler returned: 1
Compiler stderr
...
error: static assertion failed: hash function must be invocable with an argument of key type
...
你可以在这里自己试一下: