当调用像copy_if、transform等C++算法时,这些算法的最后一个参数需要一个一元或二元函数,那么我能否传递一个C库函数,例如atoi或tolower。
例如,下面的调用可以正常工作并给出正确的输出(在ideone上尝试过)
1) transform (foo, foo+5, bar, atoi);
2) transform (foo, foo+5, bar, ptr_fun(atoi));
3) transform(s.begin(),s.end(),s.begin(), static_cast<int (*)(int)>(tolower));
这种用法是否保证适用于所有C++编译器?
《C++编程思想》一书提到:“这适用于某些编译器,但不是必需的。”原因是(据我了解)transform是C++函数,期望其最后一个参数具有相同的调用约定。
该书还提出了一个解决此问题的方法,即创建一个包装函数,如在单独的cpp文件中创建此函数,并不包括iostreams头文件。
// tolower_wrapper.cpp
string strTolower(string s) {
transform(s.begin(), s.end(), s.begin(), tolower);
return s;
}
这很好运行,但我不明白这如何解决调用约定问题? transform仍然是一个C++函数,而tolower仍然是strTolower中的一个C函数,那么这里如何处理不同的调用约定。
transform(begin(s), end(s), begin(s), [](char c){ return tolower(c); });
- dyp