标签: generic-lambda

C++ 14结合了通用lambdas和变量模板

我知道泛型lambda,我知道变量模板,但是,这有什么作用?它甚至被允许了吗?

template<typename T>
auto f = [](auto a, T b){ /**/ };
Run Code Online (Sandbox Code Playgroud)

如果允许,可以按预期使用吗?那就是f<type>(var_a, var_b)

c++ lambda templates generic-lambda c++14

1
推荐指数
1
解决办法
231
查看次数

为什么C ++ 20模板lambda使用typename关键字?

我了解一致性参数,但是模板的大多数参数都是类型,因此我认为,由于lambda旨在简化定义结构的方式,它可能应该默认为typename/ class(您仍然需要编写int/size_t/short)。

如果有人不熟悉C ++ 20中对lambda的更改,请参考以下示例:

[]<typename T>(const std::vector<T>& v)
{
    for(const auto& x : v) { std::cout << x; }
};
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么不这样做:

[]<T>(const std::vector<T>& v)
{
    for(const auto& x : v) { std::cout << x; }
};
Run Code Online (Sandbox Code Playgroud)

c++ typename generic-lambda c++20

1
推荐指数
1
解决办法
215
查看次数

如何使用访问者在 lambda 中调用 std::visit ,访问者是按值捕获的函数对象

似乎std::visit在 lambda 中使用访问者调用并不简单,访问者是由值捕获的函数对象。虽然通过引用捕获工作正常。为什么会这样,是否有可能做到这一点?

在这种情况下,我不明白来自 MSVC 2017 的编译错误消息:

std::visit': 找不到匹配的重载函数
未能专门化函数模板未知类型 std::visit(_Callable &&,_Variants &&...)

我认为模板参数推导的行为与仅在std::visit没有包装调用的 lambda 的情况下进行调用非常相似。

说明问题的代码:

#include <variant>

struct T {
    void operator()(int i) {};
    void operator()(float f) {};
};

int main()
{
    std::variant<int, float> v = 1;
    T t;

    // Does not compile.
    //auto l1 = [t](auto v) { std::visit(t, v); };
    //l1(v);

    // Compiles.
    auto l2 = [&t](auto v) { std::visit(t, v); };
    l2(v);

    // Compiles.
    std::visit(t, v);

}
Run Code Online (Sandbox Code Playgroud)

c++ lambda generic-lambda c++17 std-variant

1
推荐指数
1
解决办法
353
查看次数

如何将模板lambda传递给函数并将其与不同类型一起使用

我使用宏从旧的C++时间继承了这段代码.我正在替换它,我正处于需要考虑一些结构的地步.

通常,我有这个:

if(condition)
{
    fun1(fun2(arguments, arg1)); // let's say arg1 is a vector of doubles
}
else
{
    fun1(fun2(arguments, arg2)); // let's say arg2 is a double
}
Run Code Online (Sandbox Code Playgroud)

几次.fun1()具有一组不同的依赖于参数fun2()的参数类型,我可以具有arg1arg2有作为(真实代码实际上有几层ifs各自的时间与每个分支内的不同组的类型,功能几个附加层).

我想在一个可以采用这样的模板lambda的函数中考虑这个:

[&](auto arg) { fun1(fun2(arguments, arg));}
Run Code Online (Sandbox Code Playgroud)

现在,问题是这是模板化的,所以我不能把它变成一个std::function,所以我不知道我应该使用什么样的参数来创建我的函数:

void dispatch(bool condition, const std::vector<double>& arg1, double arg2, ???? lambda)
{
    if(condition)
    {
        lambda(arg1);
    }
    else
    {
        lambda(arg2);
    }
}
Run Code Online (Sandbox Code Playgroud)

C++ 17中有这样的选项吗?甚至C++ 20?

c++ lambda template-argument-deduction generic-lambda c++17

0
推荐指数
1
解决办法
58
查看次数