В приведенном ниже коде шаблонный процесс принимает вызываемый объект (функцию), но не знает, принимает ли переданная лямбда аргументы или нет. Могу ли я как-то проверить это в шаблоне и сделать соответствующий вызов?
Код: Выделить всё
void process(auto fn) {
[[maybe_unused]] float res = fn(2.0f);
// Is there a chance to make something like:
// float res = takes-no-args() ? fn() : fn(2.0f);
// do something with res...
}
int main() {
// This is the default usage
process([](float arg) { return arg; });
// I want to be able to make such a call
process([]() { return 1.0f; });
// Possible, but verbose workaround
process([](float) { return 1.0f; });
}
Простой обходной путь — всегда передавать лямбда-выражение с одной и той же сигнатурой и игнорировать предоставленный аргумент, но это слишком многословно в случай многих аргументов.
Цель — сделать клиентский код максимально простым и понятным.
Подробнее здесь: https://stackoverflow.com/questions/792 ... -arguments
Мобильная версия