C ++:如何制作一个由std :: function索引的容器?

问题描述 投票:1回答:1

对于索引,我使用std::unordered_mapstd::map。当按如下方式使用时,它们都引发编译错误:

std::unordered_map<std::function<bool(Ent*)>, int> var;

[std::unordered_map因引用删除的功能而失败

[std::map失败,因为没有<运算符

对我来说,理想的解决方案是使用map类型,但是如果必须使用另一种类型的容器,那么应​​该不成问题

c++ hash compiler-errors stdmap std-function
1个回答
1
投票

将功能用作容器密钥的一种方法是将它们包装到函子结构中

#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_
© www.soinside.com 2019 - 2024. All rights reserved.