在C ++字符串上使用std转换

时间:2014-02-23 07:40:03

标签: c++ string algorithm c++11 transform

我试图通过使用它来解密一个简单的凯撒密码来对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));

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);}
);