Как использовать в алгоритмах перегруженные функции с аргументами по умолчанию?

Я знаю ответ на часто задаваемый Как мне указать указатель на перегруженную функцию? : Либо с присваиванием или с приведением типов, а во всех других руководствах по 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);

Что аккуратно выбирает перегрузка std :: toupper .

Но возникает вопрос: как я могу аналогичным образом выбрать перегрузку ?

char (*fp2)(char, const std::locale&) = std::toupper;
transform(in.begin(), in.end(), back_inserter(out), fp2);
// error: too few arguments to function

Или, более практично, представьте, что кто-то пытается использовать C ++ 11 std :: stoi в алгоритме преобразования вектора строк в вектор целых чисел: stoi имеет две перегрузки ( строка / wstring ), каждая из которых принимает два дополнительных аргумента по умолчанию.

Предполагая, что я не хочу явно связывать все эти значения по умолчанию, Я считаю, что это невозможно сделать, не заключив такой вызов во вспомогательную функцию или лямбду. Есть ли обертка для ускорения или магия TMP, чтобы сделать это для меня в полностью универсальном виде? Может ли обертка вроде call_as (fp2) или, что более вероятно, call_as (std :: stoi) даже быть написано?

10
задан Community 23 May 2017 в 12:31
поделиться