当调用像 copy_if、transform 等将一元或二元函数作为最后一个参数的 C++ 算法时,我可以传递像 atoi 或 tolower 这样的 C 库函数吗?
例如,下面的调用工作正常并给出正确的输出(在 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 函数,所以这里如何处理不同的调用约定。