Cocoa Objective-C:如何使用C++对象作为NSDictionary的键?

3

我有一个c++框架,我正在与我的Objective-C (Cocoa)代码一起使用。目前,我实现了包装器类来传递我的c++对象到obj-C代码中。

c++对象以层次结构存储,最近我意识到需要在obj-C对象和c++对象之间建立一对一的对应关系,因为我将它们用作NSOutlineView项目,这些项目a)需要是obj-c对象,b)需要是精确的(即,每次都需要为相应的c++对象提供相同的obj-c对象)。

我有点困惑如何以最佳(即最简单)的方式做到这一点。我希望有类似于NSDictionary的东西,我可以将c++对象输入作为键,并返回相应的obj-c对象。是否有任何方法将c++对象转换为唯一的键,以便我可以以这种方式使用NSDictionary?或者是否有任何其他实用的方法编写函数来实现类似的目的?

1个回答

0

当然可以将任何类对象转换为哈希值。下面的代码演示了如何为用户定义的类型专门化std::hash:

#include <iostream>
#include <functional>
#include <string>

struct S
{
    std::string first_name;
    std::string last_name;
};

namespace std
{
    template<>
    struct hash<S>
    {
        typedef S argument_type;
        typedef std::size_t result_type;

        result_type operator()(argument_type const& s) const
        {
            result_type const h1 ( std::hash<std::string>()(s.first_name) );
            result_type const h2 ( std::hash<std::string>()(s.last_name) );
            return h1 ^ (h2 << 1);
        }
    };
}

int main()
{
    S s;
    s.first_name = "Bender";
    s.last_name =  "Rodriguez";
    std::hash<S> hash_fn;

    std::cout << "hash(s) = " << hash_fn(s) << "\n";
}

带有示例输出:

hash(s) = 32902390710

这是一个相当大的数字,使得在相对较小的对象数量的情况下发生冲突的可能性非常小。

参见reference


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接