Возврат напрямую из лямбда-звонка C ++ 0x - PullRequest
5 голосов
/ 31 октября 2010

Я только что переписал следующий код C89, который возвращается из текущей функции:

// make sure the inode isn't open
{
    size_t i;
    for (i = 0; i < ARRAY_LEN(g_cpfs->htab); ++i)
    {
        struct Handle const *const handle = &g_cpfs->htab[i];
        if (handle_valid(handle))
        {
            if (handle->ino == (*inode)->ino)
            {
                log_info("Inode "INO_FMT" is still open, delaying removal.",
                        (*inode)->ino);
                return true;
            }
        }
    }
}

С этим гибридом C ++ 0x STL / лямбда:

std::for_each(g_cpfs->htab.begin(), g_cpfs->htab.end(), [inode](Handle const &handle) {
    if (handle.valid()) {
        if (handle.ino == inode->ino) {
            log_info("Inode "INO_FMT" is still open, delaying removal.", inode->ino);
            return true;
        }
    }});

Который генерирует:

1> e: \ src \ cpfs4 \ libcpfs \ inode.cc (128): ошибка C3499: лямбда, для которой задан тип возврата void, не может возвращать значение

Я не учел, что возвращение в лямбде, на самом деле, не возвращается из вызывающей стороны (раньше никогда не видел функции с ограничениями в C / C ++). Как мне return true из вызывающей стороны, где исходная функция сделала бы это?

Ответы [ 2 ]

6 голосов
/ 31 октября 2010

Вы не; std :: for_each не структурирован для обработки раннего возврата. Вы можете выбросить исключение ...

Или не используйте лямбду:

for (auto const &handle : g_cpfs->htab) {
  // code that was in lambda body
}
2 голосов
/ 31 октября 2010

Используйте std :: find_if () вместо std::for_each():

if (std::find_if(g_cpfs->htab.begin(), g_cpfs->htab.end(),
        [inode](Handle const &handle) {
            if (handle.valid() && handle.ino == inode->ino) {
                log_info("Inode "INO_FMT" is still open, delaying removal.",
                    inode->ino);
                return true;
            }
            return false;
        }) != g_cpfs->htab.end()) {
    return true;
}
...