gpt4 book ai didi

c++ - 将 boost::multi_index 与复合键成员函数一起使用时出现问题

转载 作者:行者123 更新时间:2023-12-05 03:17:12 25 4
gpt4 key购买 nike

我有以下容器:

using KeyValue = mutable_pair<Key, Value>;
using MyContainer = boost::multi_index_container<
KeyValue,
boost::multi_index::indexed_by<
boost::multi_index::hashed_unique<
boost::multi_index::tag<KeyValueTag>,
boost::multi_index::composite_key<
KeyValue,
boost::multi_index::const_mem_fun<KeyValue::first_type, unsigned int, &KeyValue::first_type::foo>,
boost::multi_index::const_mem_fun<KeyValue::first_type, unsigned int, &KeyValue::first_type::bar>,
boost::multi_index::const_mem_fun<KeyValue::first_type, unsigned int, &KeyValue::first_type::baz>,
>
>,
boost::multi_index::hashed_non_unique<
boost::multi_index::tag<BazTag>,
boost::multi_index::const_mem_fun<KeyValue::first_type, unsigned int, &KeyValue::first_type::baz>
>,
boost::multi_index::hashed_non_unique<
boost::multi_index::tag<BarTag>,
boost::multi_index::const_mem_fun<KeyValue::first_type, unsigned int, &KeyValue::first_type::bar>
>
>
>;

mutable_pairboost provided example for maps , Key 是一个类,它包含 foobarbaz const 成员访问器.

代码编译正常,但是当试图通过任何索引查询时,即:

MyContainer c;
const auto& byBaz = c.get<BazTag>();
const auto it = byBaz.find(11);
// or
const auto [beg, end] = byBaz.equal_range(11);

它提示

<long instantiation template error>
in mem_fun.hpp:58:23: error: no match for ‘operator*’ (operand type is ‘const mutable_pair<Key, Value>’)
58 | return operator()(*x);

我错过了什么?我已经为此苦苦挣扎了几个小时:(

最佳答案

The code compiles fine

那是因为除非您使用模板成员,否则它们不会被实例化。您的元素类型没有有效的索引。

您的索引正在尝试相当于

KeyValue pair;
unsigned Key::(*pfoo)() = &Key::foo;

pair.*pfoo

代替

pair.first.*pfoo;

您需要 KeyValue 的访问器,而不是 Key

unsigned int getFoo(const KeyValue & pair) {
return pair.first.foo();
}
unsigned int getBar(const KeyValue & pair) {
return pair.first.bar();
}
unsigned int getBaz(const KeyValue & pair) {
return pair.first.baz();
}

using MyContainer = boost::multi_index_container<
KeyValue,
boost::multi_index::indexed_by<
boost::multi_index::hashed_unique<
boost::multi_index::tag<KeyValueTag>,
boost::multi_index::composite_key<
KeyValue,
boost::multi_index::global_fun<KeyValue, unsigned int, &getFoo>,
boost::multi_index::global_fun<KeyValue, unsigned int, &getBar>,
boost::multi_index::global_fun<KeyValue, unsigned int, &getBaz>,
>
>,
boost::multi_index::hashed_non_unique<
boost::multi_index::tag<BazTag>,
boost::multi_index::global_fun<KeyValue, unsigned int, &getBaz>
>,
boost::multi_index::hashed_non_unique<
boost::multi_index::tag<BarTag>,
boost::multi_index::global_fun<KeyValue, unsigned int, &getBar>
>
>
>;

旁白:如果你有 C++17 和 boost 1.69 或更高版本,你可以对键使用更简洁的语法:

boost::multi_index::key<&getFoo, &getBar, &getBaz>
boost::multi_index::key<&getBar>

关于c++ - 将 boost::multi_index 与复合键成员函数一起使用时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74233806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com