Я хочу добиться чего-то подобного с boost multi_index_container и композитный_ключ:
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;
};
[/ NOEDIT]
Знаю это:
namespace CustomKey {
typedef enum {
VAL1 = 0x00000001,
VAL2 = 0x00000002,
ALL = 0xFFFFFFFF
} type;
}
[/ NOEDIT]
Цель состоит в том, чтобы иметь возможность выполнить следующее:
container.find(boost::make_tuple(CustomKey::VAL1, CustomKey::ALL));
[/ NOEDIT]
Что позволило бы мне получить все элементы, для которых LogicalAnd возвращает true.
Проблема в том, что мне не удается заставить мой LogicalAnd компаратор работать с моим multi_index_container.
Я могу получить его для сборки, добавив Composite_key_hash прямо перед Composit_key_equal_to:
composite_key_hash<
boost::hash<int>,
boost::hash<int>
>
[/ NOEDIT] Но находить операция не работает, как ожидалось, поэтому она не сильно меняется …
Я искал документацию для надстройки, и я пробовал различные реализации, но я тону в объеме информации …
Любая помощь приветствуется!
Вы используете гашиш для вашего мультииндекса.
Это означает, что LogicalAnd
Компаратор никогда не вызывается, если что-то не найдено в правильном контейнере хеша.
0x01
а также 0xFF
не хэшируйте к тому же значению даже если 0x01 & 0xFF == 0x01
, То есть, LogicalAnd
вернул бы true, но это никогда не вызывается.
Вам нужна хеш-функция, которая является инвариантной по отношению к. LogicalAnd
и я не думаю, что это возможно. Предполагается, что большинство хеш-функций сводят к минимуму коллизии между различными значениями ключа.
Боюсь, вам нужно придумать другую систему индексации.
Других решений пока нет …