LINUX.ORG.RU

История изменений

Исправление DarkEld3r, (текущая версия) :

У тебя аналогичный код и в C++ не скомпилится. У тебя у двух лямбд разный тип.

Хм... в чём-то ты прав. Тем не менее, в С++ можно так:

template<typename T>
int test(T t1, T t2)
{
    return t1() + t2();
}

int main()
{
    test<int (*)()>([](){ return 10;}, [](){ return 20;});
}

Да, мы тут пользуемся тем, что лямбды приводятся к указателю на функцию, если ничего не захватывают. Если захватывают, то так не получится. Но вообще код не эквивалентен. В отличии от примера на расте, мы тут никаких ограничений на сигнатуру не налагаем (ну кроме вызова без параметров). Правильно будет вот так:

int test(function<int()> t1, function<int()> t2)
{
    return t1() + t2();
}

Хотя я, кажется, понял.

Исправление DarkEld3r, :

У тебя аналогичный код и в C++ не скомпилится. У тебя у двух лямбд разный тип.

Хм... в чём-то ты прав. Тем не менее, в С++ можно так:

template<typename T>
int test(T t1, T t2)
{
    return t1() + t2();
}

int main()
{
    test<int (*)()>([](){ return 10;}, [](){ return 20;});
}

Хотя я, кажется, понял.

Да, мы тут пользуемся тем, что лямбды приводятся к указателю на функцию, если ничего не захватывают. Если захватывают, то так не получится. Но вообще код не эквивалентен. В отличии от примера на расте, мы тут никаких ограничений на сигнатуру не налагаем (ну кроме вызова без параметров). Правильно будет вот так:

int test(function<int()> t1, function<int()> t2)
{
    return t1() + t2();
}

Исходная версия DarkEld3r, :

У тебя аналогичный код и в C++ не скомпилится. У тебя у двух лямбд разный тип.

Хм... в чём-то ты прав. Тем не менее, в С++ можно так:

template<typename T>
int test(T t1, T t2)
{
    return t1() + t2();
}

int main()
{
    test<int (*)()>([](){ return 10;}, [](){ return 20;});
}

Да, мы тут пользуемся тем, что лямбды приводятся к указателю на функцию, если ничего не захватывают. Если захватывают, то так не получится. Но вообще код не эквивалентен. В отличии от примера на расте, мы тут никаких ограничений на сигнатуру не налагаем (ну кроме вызова без параметров). Правильно будет вот так:

int test(function<int()> t1, function<int()> t2)
{
    return t1() + t2();
}