1

我想用 boost multi_index_container 和 composite_key 来实现这样的目标:

struct LogicalAnd {
    bool operator()(const int& argVal1, const int& argVal2) const {
        return int(argVal1 & argVal2) == argVal1;
    }
};

template<class T, class Enable = void>
class FooContainer;

template <class T>
struct FooContainer<T,typename boost::enable_if<boost::is_base_of<IFoo, T> >::type> {
    typedef multi_index_container<
            boost::shared_ptr<T>,
            indexed_by<
            hashed_non_unique<
            composite_key<
            T,
            const_mem_fun<T,int,&T::getKey1>,
            const_mem_fun<T,int,&T::getKey2>
    >,
    composite_key_equal_to<
    LogicalAnd,
    LogicalAnd
    >
    >
    >
    > shared_ptr_type;
};

知道:

namespace CustomKey {
    typedef enum {
        VAL1 = 0x00000001,
        VAL2 = 0x00000002,
        ALL = 0xFFFFFFFF
    } type;
}

目标是能够执行以下操作:

container.find(boost::make_tuple(CustomKey::VAL1, CustomKey::ALL));

这将允许我检索 LogicalAnd 返回 true 的所有元素。

问题是我无法让我的 LogicalAnd 比较器与我的 multi_index_container 一起工作。

我可以通过在composite_key_equal_to 之前添加一个composite_key_hash 来构建它:

composite_key_hash<
      boost::hash<int>,
      boost::hash<int>
>

但是find操作并没有按预期工作,所以它并没有太大变化......

我搜索了 boost 文档,并尝试了各种实现,但我被大量的信息淹没了......

任何帮助表示赞赏!

4

1 回答 1

0

您正在为多索引使用哈希。

这意味着LogicalAnd除非在正确的哈希桶中找到某些东西,否则不会调用比较器。

0x01并且0xFF不要散列到相同的值,即使 0x01 & 0xFF == 0x01. 也就是说,LogicalAnd将返回 true,但它从未被调用过。

您将需要一个不变的哈希函数。LogicalAnd,而且我认为这是不可能的。根据设计,大多数哈希函数都应该最小化不同键值之间的冲突。

恐怕你需要想出一些不同的索引系统。

于 2013-05-02T17:28:56.113 回答