gpt4 book ai didi

c++ - 在通用 lambda 中使用模板参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:24:06 27 4
gpt4 key购买 nike

GCC允许以下语法作为扩展:

// a functional object that will add two like-type objects
auto add = [] <typename T> (T a, T b) { return a + b; };

n3418 ,2012 年通用 lambda 提案,我们看到允许上述内容的语法:

overload( []<class T>(T* p) {...},

但是,由于它是一个扩展,所以语法显然不存在(或不允许)。当我们使用 auto 时,上述语法在什么情况下有用,为什么不存在(或不允许)语法?

最佳答案

在我看来,C++14 的多态 lambda 更简洁。

您可以像下面这样重现示例情况的效果:

struct A {};
struct B {};

int operator+(A, A) { return 1; }
int operator+(B, B) { return 2; }
int operator+(A, B) { return 3; }
int operator+(B, A) { return 4; }

int main() {
auto add = [](auto a, decltype(a) b) { return a + b; };
auto flexible_add = [](auto a, auto b) { return a + b; };

add(A{}, A{}); // works
add(B{}, B{}); // works
add(A{}, B{}); // doesn't work

flexible_add(A{}, A{}); // works
flexible_add(B{}, B{}); // works
flexible_add(A{}, B{}); // works

auto deref = [](auto *a) { return *a; };
int foo{};
A a;
B b;
deref(&foo); // works
deref(&a); // works
deref(&b); // works
deref(foo); // doesn't work
deref(a); // doesn't work
deref(b); // doesn't work
}

虽然在很多情况下 GCC 扩展功能更强大,但不仅限于您的用例(它更适合的地方)。例如,关于非类型模板参数:

#include <cstddef>
#include <utility>
#include <iostream>

void print(std::initializer_list<std::size_t> il)
{
for (auto&& elem : il) std::cout << elem << std::endl;
}

int main()
{
auto indexed_lambda = [] <std::size_t... Is> (std::index_sequence<Is...>) { print({Is...}); };

indexed_lambda(std::make_index_sequence<5>{});
}

Coliru

复杂泛型参数类型:

void foo() {}

int main() {
auto accept_no_args_fun_only = [] <typename R> (R (*)()) {};

accept_no_args_fun_only(foo);
}

Coliru

可变参数:

#include <tuple>
#include <vector>

int main() {
auto accept_vector = [] (std::vector<auto> &&) {}; // Unconstrained placeholder from Concept TS, but not variadic
auto accept_tuple = [] <typename... Args> (std::tuple<Args...> &&) {};

accept_vector(std::vector{42});
accept_tuple(std::tuple{42});
}

Coliru

我不知道涉及包含通用 lambda 的讨论,但我可以看到有人在思考这样的扩展是否值得包括在当前语法涵盖大多数用例、简洁且适合 lambda 的意图时,这通常是用于生成简短的代码片段。

编辑

GCC 扩展已决定在 the first C++20 ISO standards meeting 上成为 C++ 的一部分| :

关于c++ - 在通用 lambda 中使用模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26435052/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com