Неудачный вывод аргумента в представлениях :: take_ while - PullRequest
2 голосов
/ 14 июля 2020

У меня есть этот код:

for (auto e : foo | ::std::views::take_while([](const char* x) { return x != nullptr; }))
      std::cout << e << "\n";

Все в порядке, но эта лямбда длинная и громоздкая. Поскольку это происходит много раз, я решаю вместо этого использовать именованный объект-функцию. *

Почему и что с этим делать? (За исключением вызова take_while с предикатом без шаблона, который, очевидно, работает).

1 Ответ

5 голосов
/ 14 июля 2020

std::views::take_while требует, чтобы оператор вызова переданного ему объекта был квалифицирован как const, чтобы дедукция была успешной:

struct non_null                                    
{ 
    template <typename T> 
    bool operator()(const T* t) const {  // <-- const-qualified
            return t != nullptr;
    }
};

Однако, если вы просто хотите назвать предикат, вы можно просто сделать:

auto non_null = [](const auto* x) { return x != nullptr; };

и использовать его так:

for (auto e : foo | ::std::views::take_while(non_null))
      std::cout << e << "\n";

Вот демо .

...