Использование преобразования std для строки C ++

0

Я пытаюсь немного попрактиковаться в std :: transform, используя его, чтобы расшифровать простой Cesher Цезаря. Но, очевидно, мое определение функции неверно, поскольку компилятор считает аргумент унарной функции недопустимым. Вот мой код:

char CryptoModule::UndoCaesar(char& letter)
{
    return (letter - atoi(key_.c_str()) % 128);
}

void CryptoModule::DecryptCaesar()
{
    std::transform(data_.begin(), data_.end(), data_.begin(), UndoCaesar);
}

Может ли кто-нибудь рассказать мне, где ошибка? Кроме того, что мне нужно изменить, чтобы использовать for_each? Я считаю, что это будет связано с изменением возвращаемого значения на пустоту и сохранением результата в письме.

Спасибо, и хорошего дня

Edit: Пробовал добавлять bind, но все равно не работает. Текущий вызов:

std::transform(data_.begin(), data_.end(), data_.begin(), bind(&UndoCaesar, this, std::placeholders::_1));
Теги:
string
c++11
algorithm
transform

1 ответ

8

Ваша данная функция-член имеет скрытый this параметр, поэтому вам необходимо связать это, чтобы передать его:

std::transform(data_.begin(), data_.end(), data_.begin(), 
    std::bind(&CryptoModule::UndoCaesar, this, std::placeholders::_1)
);

Обратите внимание, что std::bind находится в <functional>. Все это приводит к тому, что std::transform вызывает любой объект, подобный функции, f, он принимает как f(currentElement) и в свою очередь вызывает UndoCaesar(this, currentElement) this является частью его состояния, потому что вы связали его,

Кроме того, вы можете обернуть вызов в лямбда, который фиксирует this чтобы он мог использоваться для вызова функции-члена (неявно, как обычно):

std::transform(data_.begin(), data_.end(), data_.begin(), 
    [this](char c) {return UndoCaesar(c);}
);
  • 0
    Кажется, мне все еще кажется, что у меня отсутствует список аргументов. Кстати, откуда скрылся этот параметр?
  • 2
    @ BrunoAyllon, это функция-член. Членским функциям нужен объект для работы. Не могли бы вы быть более конкретным с вашей ошибкой? Вот рабочий пример .
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню