Std:: ptr_fun для С++ 17

Я использую std::ptr_fun следующим образом:

static inline std::string &ltrim(std::string &s) {
    s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun<int, int>(std::isspace))));
    return s;
}

как представлено в этом ответе.

Однако это не скомпилировано с С++ 17 (с использованием Microsoft Visual Studio 2017) с ошибкой:

error C2039: 'ptr_fun': is not a member of 'std'

Как это можно зафиксировать?

Ответ 1

Вы используете лямбда:

static inline std::string &ltrim(std::string &s) {
    s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](int c) {return !std::isspace(c);});
    return s;
}

Ответ, который вы указали, относится к 2008 году, задолго до того, как существовали С++ 11 и lambdas.

Ответ 2

Просто используйте лямбда:

[](unsigned char c){ return !std::isspace(c); }

Обратите внимание, что я изменил тип аргумента на unsigned char, см. примечания для std::isspace для чего.

std::ptr_fun был устарел в С++ 11 и полностью удаляется в С++ 17.

Ответ 3

В качестве альтернативы вы можете использовать std:: not_fn:

static inline std::string &ltrim(std::string &s) {
    s.erase(s.begin(), std::find_if(s.begin(), s.end(),
        std::not_fn(static_cast<int(*)(int)>(std::isspace))));
    return s;
}

Ответ 4

Согласно cppreference, std::ptr_fun устарел с С++ 11 и прекратил работу с С++ 17.

Аналогично, std::not1 устарел с С++ 17.

Так что лучше всего не использовать, но лямбда (как объяснялось в других ответах).