よく聞かれる「オーバーロードされた関数へのポインターを指定するにはどうすればよいですか?」に対する答えを知っています。:代入またはキャストのいずれかを使用し、他のすべての C++ チュートリアルでは、次のように文字列を大文字にします (ギブまたはテイクstatic_cast
):
transform(in.begin(), in.end(), back_inserter(out), (int(*)(int)) std::toupper);
またはこのように:
int (*fp)(int) = std::toupper;
transform(in.begin(), in.end(), back_inserter(out), fp);
<cctype>
のオーバーロードをきちんと選択しstd::toupper
ます。
しかし、ここで疑問が生じます<locale>
。同様の方法でオーバーロードを選択するにはどうすればよいでしょうか?
char (*fp2)(char, const std::locale&) = std::toupper;
transform(in.begin(), in.end(), back_inserter(out), fp2);
// error: too few arguments to function
または、より実際的にstd::stoi
は、アルゴリズムで C++11 を使用して、文字列のベクトルを整数のベクトルに変換しようとしている人を考えてみstoi
てください。2 つのオーバーロード ( string
/ wstring
) があり、それぞれが 2 つの追加の既定の引数を取ります。
これらすべてのデフォルトを明示的にバインドしたくないと仮定すると、そのような呼び出しを補助関数またはラムダでラップせずにこれを行うことは不可能だと思います。完全に一般的な方法でそれを行うためのブーストラッパーまたは TMP マジックはありますか? ラッパーは好きですcall_as<char(char)>(fp2)
か、call_as<int(const std::string&)>(std::stoi)
それとも書くことさえできますか?