Поиск boost :: bimap для текущего экземпляра класса

Хорошо, я добавил boost :: bimap так:

boost::bimap<object*, position> object_list;

Где объект и позиция — это класс и структура соответственно.

В текущем объекте, сохраненном в bimap, я хочу найти свою собственную запись.

В настоящее время я пытаюсь сделать это так:

void order::do_thing() {
...
position pos = object_list.left.at(this);
...
}

У меня проблемы с анализом вывода ошибок, но кажется, что функция at bimap не любит постоянство и / или эталонность этого (и да, я знаю, что это r-значение).

Каков будет правильный / предложенный способ сделать этот поиск?

Вот фрагмент ошибки:

order.cpp:117:56:   required from here
/usr/include/boost/bimap/container_adaptor/associative_container_adaptor.hpp:207:56: error: no match for call to ‘(const boost::bimaps::container_adaptor::detail::key_to_base_identity<object*, object* const>) (order* const&)’
this->template functor<key_to_base>()(k)

(Изменить добавлено, чтобы обратиться к комментариям sehe и указать на проблему)

Извиняюсь, если мой пост был в плохом этикете, я новичок в публикации на SO, и у меня было предположение, что простой сброс всего моего кода (просто включение пользовательских объектов и шаблонов для этого раздела кода — это сотни строк) считаться дурным тоном, поэтому я урезал его до (как я думал, был) минимума, чтобы все еще понять проблему.

И просто чтобы обратиться к ссылке на тестовые случаи, я пишу тестовые случаи. В этом случае я обменивал вектор на бимап для добавления в код позиции, и это фактически не компилируется (хотя я скажу, что я не очень ясно указал, что это ошибка компиляции, а не трассировка стека). Я предполагаю, что вы (sehe) думали, что я говорил об ошибке во время выполнения, потому что в противном случае я не вижу, насколько релевантна ссылка.

Так или иначе, я урезал код до фактического минимума, чтобы воспроизвести ошибку, чтобы я мог опубликовать ее здесь, а затем понял реальную проблему. Как показано выше, bimap содержит значения <объект *, position> Но класс, пытающийся вставить себя в бимап, порядок учебный класс: voidпорядок::do_thing() {

Так что это оказалось простой ошибкой типа. Извините, все, что задали действительно тупой вопрос. Я думаю, это то, что я получаю за работу над проектами в 3 часа ночи.

1

Решение

Нет проблем.

Единственная ловушка, о которой я могу думать, это то, что у вас есть this неявно const. В этом случае карта должна будет указывать на const object вместо!

Смотрите этот образец здесь. Раскоментируйте // const чтобы увидеть вариацию с const:

Жить на Колиру (Неконстантный)

Жить на Колиру (Const)

#include <boost/bimap.hpp>
#include <iostream>

using position = std::string;

#define USE_CONST // const

struct object {
template <typename BiMap>
position get_position(BiMap const& bimap) USE_CONST {
return bimap.left.at(this);
}
};

int main() {
std::vector<object> instances(10);

boost::bimap<object USE_CONST*, position> mapping;

for (auto& instance : instances)
mapping.insert({&instance, "instance #" + std::to_string(mapping.size()+1)});

for (auto& instance : instances)
std::cout << "Instance reports " << instance.get_position(mapping) << "\n";
}

Печать

Instance reports instance #1
Instance reports instance #2
Instance reports instance #3
Instance reports instance #4
Instance reports instance #5
Instance reports instance #6
Instance reports instance #7
Instance reports instance #8
Instance reports instance #9
Instance reports instance #10
0

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

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