Как написать итерируемый класс со стражем, чтобы использовать его в find_if?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как написать итерируемый класс со стражем, чтобы использовать его в find_if?

Сообщение Anonymous »

У меня есть код на C++, написанный где-то в марте 2023 года. Тогда он нормально компилировался. Теперь мне нужно внести в него несколько изменений, но он больше не компилируется. Используемым языковым стандартом был C++20. Я не помню, какая версия VS тогда использовалась. Он определенно был обновлен до последней версии.
Теперь я получаю сообщение об ошибке «ошибка C3889: вызов объекта типа класса 'std::ranges::_Find_if_fn': соответствующий оператор вызова не найден». при звонке
ranges::find_if(network_list, [](auto const& item) { return item.IsConnected(); })

затем он говорит что-то о «'std::ranges::borrowed_iterator_t': связанные ограничения не удовлетворены», а затем «концепция 'std::ranges::range' оценен как false". Непонятно, что происходит.
Я думаю, что find_if стал более строгим, но я не понимаю, как именно. network_list — это экземпляр пользовательской реализации итерации с методами начала и конца. метод end возвращает дозорный класс. Я предполагаю, что проблема связана с этим, потому что если я изменю вызов на
ranges::find_if(network_list.begin(), network_list.end(), [](auto const& item) { return item.IsConnected(); })

Я получаю другую ошибку, которая почему-то имеет смысл. В нем говорится, что «концепция 'std::sentinel_for' оценена как ложная», затем «концепция 'std::_Weakly_equality_comparable_with' оценена как ложная», а затем «концепция 'std::_Half_equality_comparable ' оценивается как false".
Возможно, моя реализация этой итерации и использование сторожевого класса не следуют определенным правилам, но я не могу найти пример того, как они должны быть. реализовано для работы таких функций, как find_if. Может ли кто-нибудь показать правильный пример?
ОБНОВЛЕНИЕ:
Отвечаем на вопрос о типе network_list. Я подумал, что достаточно заявить, что это собственная реализация iterable. Вот
template
class IterableAsync final {
friend class YieldPromise;
friend class IteratorAsync;

using handle_type = std::coroutine_handle;

private:
handle_type m_objHandle;

public:
// promise_type is expected by STL to be publicly declared
using promise_type = YieldPromise;

private:
explicit IterableAsync(handle_type objHandle) : m_objHandle(std::move(objHandle)) {
}

public:
IterableAsync(IterableAsync const& other) = delete;

IterableAsync(IterableAsync&& other) noexcept :
m_objHandle(other.m_objHandle) {
other.m_objHandle = nullptr;
}

~IterableAsync() {
if(m_objHandle) {
m_objHandle.destroy();
}
}

public:
IteratorAsync begin() {
return IteratorAsync(*this, false);
}

// ReSharper disable once CppMemberFunctionMayBeStatic
IteratorAsyncSentinel end() {
return IteratorAsyncSentinel();
}

public:
IterableAsync& operator =(IterableAsync const& other) = delete;

IterableAsync& operator =(IterableAsync&& other) noexcept {
m_objHandle = other.m_objHandle;
other.m_objHandle = nullptr;
return *this;
}
};


Подробнее здесь: https://stackoverflow.com/questions/783 ... in-find-if
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»