对于索引,我使用std::unordered_map
和std::map
。当按如下方式使用时,它们都引发编译错误:
std::unordered_map<std::function<bool(Ent*)>, int> var;
[std::unordered_map
因引用删除的功能而失败
[std::map
失败,因为没有<
运算符
对我来说,理想的解决方案是使用map
类型,但是如果必须使用另一种类型的容器,那么应该不成问题
将功能用作容器密钥的一种方法是将它们包装到函子结构中
#include <unordered_map>
#include <typeinfo>
struct FunctorSum {
int operator()(int x, int y) {
return x + y;
}
};
struct FunctorMult {
int operator()(int x, int y) {
return x * y;
}
};
int main() {
std::unordered_map<size_t, int> funcToInt;
funcToInt[typeid(FunctorSum).hash_code()] = 0;
funcToInt[typeid(FunctorMult).hash_code()] = 1;
return 0;
}
这里我使用typeid
作为哈希,但是也可以将其硬编码为函子结构。
另一种方法是使用std::function::target_type计算该函数的哈希,该哈希仅适用于lambda。但是您始终可以将任何函数包装到lambda中。
#include <iostream>
#include <functional>
using FuncType = std::function<bool(int)>;
bool x(int v) { return v == 0; }
std::string hash(FuncType f) {
return f.target_type().name();
}
int main() {
auto y = [](int v) { return v == 1; };
auto z = [](int v) { return v == 2; };
std::cout << "x: " << hash(x) << std::endl;
std::cout << "y: " << hash(y) << std::endl;
std::cout << "z: " << hash(z) << std::endl;
return 0;
}
输出
x: PFbiE
y: Z4mainEUliE_
z: Z4mainEUliE0_