Я пытаюсь немного попрактиковаться в 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));
Ваша данная функция-член имеет скрытый 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);}
);