我试图通过使用它来解密一个简单的凯撒密码来对std :: transform进行一些练习。但是看起来我的函数定义是错误的,因为编译器认为一元函数参数无效。这是我的代码:
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,我需要修改什么?我相信它会涉及将返回值更改为void并将结果存储在letter中。
谢谢,祝你有愉快的一天
编辑:尝试添加绑定,但仍然无法正常工作。目前的电话是:
std::transform(data_.begin(), data_.end(), data_.begin(), bind(&UndoCaesar, this, std::placeholders::_1));
答案 0 :(得分: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
的lambda中,以便它可以用于成员函数调用(隐式地,像正常一样):
std::transform(data_.begin(), data_.end(), data_.begin(),
[this](char c) {return UndoCaesar(c);}
);