Trim

Чёт я туплю ((

Пишу функцию trim, которая удаляет лидирующие и концевые пробелы в строке:

template <typename T>
std::basic_string<T> trim(const std::basic_string<T>& str) {

    typedef std::basic_string<T>::const_iterator iter;

    iter i = std::find_if(str.begin(), str.end(), [](const T ch) { return !isspace(ch); });
    iter j = std::find_if(str.rbegin(), str.rend(), [](const T ch) { return !isspace(ch); });
    return std::basic_string<T>(i, j);
}

Второй вызов find_if возвращает reverse_iterator, а мне нужен прямой. Как победить?

1) Здесь понадобится typename:

typedef typename std::basic_string<T>::const_iterator iter;

2) Чтобы получить доступ к основному итератору, есть функция-член base:

iter j = std::find_if(str.rbegin(), str.rend(), [](const T ch) { return !isspace(ch); }).base();//find_if вернет reverse-iterator

3) Зачем танцы с basic_string и шаблонами? Почему не просто std::string? Код всё равно прибит гвоздями к isspace.

Спасибо.

А почему здесь необходим typename?

Зачем танцы с basic_string и шаблонами?

Задумка есть обобщить это как минимум на wchar_t.

Имя зависимо от параметра шаблона, поэтому необходим typename.
http://alenacpp.blogspot.ru/2006/08/typename.html

В VS и без typename будет работать, но это лишь потому, что у них парсер не от мира сего и не умеет в two phase name lookup, поэтому там даже такая хрень компилируется:

template<typename T>
void foo()
{
    blablabla
}

Конечно же, до использования. А вот при нормальном разрешении имен в шаблонах, это привело бы к ошибке уже до использования foo.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.