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 関数であるため、この異なる呼び出し規則がここでどのように処理されるかを示します。