Подтвердить что ты не робот

Указать значение по умолчанию std:: function

void func(const std::function<void()>& f = empty)
{
    if(f)
        f();
}

что такое "пустой"? Я использую [](){}. Но технически, это не пусто, выполняется f().

4b9b3361

Ответ 1

void func(const std::function<void()>& f = {}) {
    if(f) f();
}

LIVE DEMO

Ответ 2

const std::function<void()>& f = nullptr

или

const std::function<void()>& f = std::function<void()>()

Ответ 3

Я использовал бы nullptr для пустого случая. Его можно использовать, потому что вы никогда не используете полнофункциональные объекты, а только указатели на них, поэтому func(f1); будет на самом деле func(&f1) = > вы всегда будете передавать указатели на func, поэтому nullptr является IMHO лучшим кандидатом.

Это компилируется и запускается:

void func(const std::function<void()>& f = nullptr)
{
    if(f)
        f();
}

Альтернативой использования функции по умолчанию будет:

void func(const std::function<void()>& f = std::function<void()>()) {
    try {
        f();
    }
    catch(std::bad_function_call e) {
    }
}

с использованием исключения catch. Выбор между 2 главным образом зависит от того, ожидаете ли вы, что будет пустой случай; почти никогда: используйте исключение и иногда: тест перед вызовом.

В качестве вопроса упоминается if (f), используйте nullptr

Ответ 4

Вы можете попробовать следующее:

const std::function<void()> & f = std::function<void()>()

По мере добавления Базиля в стандарте говорится:

§ 20.8.11.1 Класс bad_function_call [func.wrap.badcall]

1/Исключение типа bad_function_call выбрасывается function:: operator() (20.8.11.2.4), когда объект-оболочка функции не имеет цели.