我希望通过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;
};
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;
}
namespace CustomKey {
typedef enum {
VAL1 = 0x00000001,
VAL2 = 0x00000002,
ALL = 0xFFFFFFFF
} type;
}
这将允许我检索LogicalAnd返回true的所有元素。
问题是我无法让我的LogicalAnd比较器与我的multi_index_container一起使用。
我可以通过在composite_key_equal_to之前添加一个composite_key_hash来构建它:
container.find(boost::make_tuple(CustomKey::VAL1, CustomKey::ALL));
container.find(boost::make_tuple(CustomKey::VAL1, CustomKey::ALL));
但查找操作无法按预期工作,因此不会发生太大变化......
我搜索了增强文档,我尝试了各种实现,但是我的信息量已经被淹没......
感谢任何帮助!
答案 0 :(得分:0)
您正在为多索引使用哈希。
这意味着永远不会调用LogicalAnd
比较器,除非在正确的哈希桶中找到了什么。
0x01
, 0xFF
和0x01 & 0xFF == 0x01
也不会哈希到相同的值。也就是说,LogicalAnd
将返回true,但它永远不会被调用。
你需要一个不变的哈希函数。 LogicalAnd
,我不认为这是可能的。根据设计,大多数散列函数应该最小化不同键值之间的冲突。
你需要提出一些不同的索引系统,我担心。