Проверьте, допустима ли возвращаемая функция std::function в С++ 11.

Я хочу реализовать динамическую очередь задач следующим образом:

typedef std::function<void(void)> Job;
typedef std::function<Job(void)> JobGenerator;

// ..

JobGenerator gen = ...;
auto job = gen(); 
while (IsValidFunction(job))
{
    job();
}

Как я могу реализовать IsValidFunction? Есть ли какое-то значение по умолчанию для std::function для проверки?


person Domi    schedule 25.11.2013    source источник
comment
Я не понимаю, что делает его действительным. Что вы подразумеваете под существует?   -  person doctorlove    schedule 25.11.2013
comment
en.cppreference.com/w/cpp/utility/functional/function/   -  person jrok    schedule 25.11.2013
comment
Возможно, это while(job) то, что вы ищете?   -  person PlasmaHH    schedule 25.11.2013


Ответы (2)


Вы можете просто проверить job как логическое значение:

while (auto job = gen())
{
    job();
}

Это своего рода сокращение, которое присваивает job из gen() каждый раз в цикле, останавливаясь, когда job оценивается как false, полагаясь на std::function<>::operator bool: http://en.cppreference.com/w/cpp/utility/functional/function/operator_bool

person John Zwinck    schedule 25.11.2013
comment
Хорошая вещь. Я уже знал об операторах преобразования, но совершенно о них забыл! Я думаю, эта ссылка объясняет концепцию лучше. - person Domi; 25.11.2013
comment
Осторожно @Domi, есть ошибки при преобразовании bool std::function в дикой природе: stackoverflow.com/questions/19578237/ - person Yakk - Adam Nevraumont; 25.11.2013