По умолчанию пользовательский ввод с использованием лямбда-выражения, когда параметр не передается явно

Я написал следующий код (Все еще интересуется его использованием...) по умолчанию для пользовательского ввода, если параметр не передан.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

unsigned getInput() {
    unsigned input;
    std::cin >> input;
    return input;
}

void foo(unsigned number = getInput()) {
    std::cout << number << "\n";
}

int main() {
    foo(1); //prints 1
    foo();  //defaults to user input    
    return 0;
}

Я хотел спросить, можем ли мы каким-либо образом преобразовать функцию getInput() в лямбда? Что-то в духе

void foo(unsigned number = { []() {unsigned num = 0; std::cin >> num; return num; } }) {
    std::cout << number << "\n";
}

Кроме того, как добиться аналогичной функциональности в python?


person kesarling    schedule 21.05.2020    source источник


Ответы (2)


Да, вы можете использовать лямбду. Что вам нужно сделать, так это вызвать лямбду после того, как вы определите ее как

void foo(unsigned number = []() {unsigned num = 0; std::cin >> num; return num; }()) 
//                         ^                   define lambda                    ^^^
//                                                               call lambda_____|
person NathanOliver    schedule 21.05.2020

Конечно, но вы пропустили вызов лямбда:

void foo(unsigned number = [] {
               unsigned num = 0; 
               std::cin >> num; 
               return num; 
              }()   // <- call here
        ) 
{
    std::cout << number << "\n";
}
person cigien    schedule 21.05.2020
comment
Большое спасибо. Кроме того, []() не всегда необходимо при определении лямбда? Я вижу, вы не использовали скобки после [] - person kesarling; 21.05.2020
comment
Это правильно. () после [] является необязательным в лямбде, которая не принимает аргументов. - person cigien; 21.05.2020