LINUX.ORG.RU

c++ и лямбды: есть ли новшества, которые позволяют делать рекурсии с использованием auto?

 ,


1

1

Скажем для указанного ниже примера, где и что можно заменить на auto или вообще не указывать и для каких это версий стандарта будет?

function<int(int i)> recu = [&recu](int i) -> int {
return (i > 100 ? i : recu(i*3));
};

В твоем примере тебя половина компиляторов пошлет, пока ты не разделишь это на два statement-а (я почему-то уверен, что все).

По стандарту это или нет, я не помню. Но логично, если да.

function<int(int i)> recu;

recu = [&recu](int i) -> int {
  return (i > 100 ? i : recu(i*3));
};
Kuzy ★★★
()

Можно заюзать static + (тот факт, что с лямбда пустым [] - это сишная функция):

static int (*recu)(int) = [](int i) -> int { 
  return (i > 100 ? i : recu(i*3));
};

Но capture list должен остаться пустым.

Kuzy ★★★
()
Ответ на: комментарий от anonymous

Сорь, ты прав. Это будет так только если там какой-то вывод типов участвует.

Kuzy ★★★
()
Ответ на: комментарий от Kuzy

Можно заюзать static + (тот факт, что с лямбда пустым [] - это сишная функция)

Это хорошо, возьму на заметку, чуть позже проверю. Но факт двойного описания типов все равно остается.

victor79
() автор топика
Ответ на: комментарий от victor79
template <class F>
auto make_rec(F&& f) {
    return [f = std::forward<F>(f)] (auto&&... args) {
        return f(std::ref(f), std::forward<decltype(args)>(args)...);
    };
}

int main() {
    auto recu = make_rec([] (auto recu, int i) -> int {
       return (i > 100 ? i : recu(recu, i*3));
    });

    std::cout << recu(3) << std::endl;

}

Kuzy ★★★
()

В C++17, кажется, можно писать так (из-за deduction guides):

std::function recu = [&recu](int i) -> int {
    return (i > 100 ? i : recu(i*3));
};

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

В C++17, кажется, можно писать так (из-за deduction guides)

у меня такое не прошло, сказало «missing template arguments before recu», компилировал через оболочку Qt Creator:

QMAKE_CXXFLAGS += -std=c++17
QMAKE_CXX = g++-7

victor79
() автор топика
Ответ на: комментарий от victor79

Похоже на то, значит обманули. Это было в какой-то презентации. Я сам сомневался, но думал может как-то сделали и не проверил.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Тут вывод типа recu, а пока он не выведен, захватывать переменную нельзя.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.