boost :: multi_index :: композитный_ключ_результат, как получить символ *, который составляет составной ключ?

Для кода ниже:

struct MyStruct
{
char* firstName;
char* secondName;
int age;
};

typedef composite_key
<MyStruct*,
BOOST_MULTI_INDEX_MEMBER(MyStruct, char*, firstName),
BOOST_MULTI_INDEX_MEMBER(MyStruct, char*, secondName)
> comp_key;

typedef multi_index_container
<
MyStruct*,
indexed_by
<
ordered_unique
<
comp_key,
CompareLess
>
>
> MyContainer;

Я могу легко написать бесподобный, как показано ниже:

struct CompareLess
{   // functor for operator<
static inline int compare(const char* left, const char* right)
{
return strcmp(left, right);
}
inline bool operator()(const char* left, const char* right) const
{   // apply operator<= to operands
return compare(left, right)<0;
}

static inline int compare(const boost::tuple<char*>& x, const char*y)
{
return compare(x.get<0>(),y);
}
inline bool operator()(const boost::tuple<char*>& x, const char*y) const
{
return compare(x,y)<0;
}

static inline int compare(const boost::multi_index::composite_key_result<comp_key>& k, const boost::tuple<char*>& y)
{
return -compare(y,(const char*)(k.value->firstName));
}
inline bool operator()(const boost::multi_index::composite_key_result<comp_key>& k, const boost::tuple<char*>& y) const
{
return compare(k,y)<0;
}

static inline int compare(const boost::tuple<char*>& y, const boost::multi_index::composite_key_result<comp_key>& k)
{
return compare(y,(const char*)(k.value->firstName));
}
inline bool operator()(const boost::tuple<char*>& y, const boost::multi_index::composite_key_result<comp_key>& k) const
{
return compare(y,k) <0;
}
}

Но когда я хочу написать что-то вроде ниже:

typedef composite_key
<double,
char*,
char*
> comp_key;

У меня проблемы с написанием CompareLess с помощью функции ниже

    static inline int compare(const boost::tuple<char*>& y, const boost::multi_index::composite_key_result<comp_key>& k)
{
return compare(y,(const char*)(k.value->firstName));
}

Я не знаю, как написать некоторый код как «k.value-> firstName», чтобы получить char * для сравнения, так как значение больше не является структурой, а только удваивается. Так где же взять поле для сравнения? есть что-то вроде k.get<0> ()?

0

Решение

Критерии сравнения составных ключей задаются через composite_key_compare, В вашем конкретном случае вы хотели бы что-то вроде

ordered_unique<
comp_key,
composite_key_compare<
std::less<double>,
CompareLess,
Compareless
>
>

где CompareLess нужно только вызывать с const char*s:

struct CompareLess
{
static inline int compare(const char* left, const char* right)
{
return strcmp(left, right);
}
inline bool operator()(const char* left, const char* right) const
{
return compare(left, right)<0;
}
};

Остальная часть лесов обеспечивается composite_key_compare,

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector