相关疑难解决方法(0)

什么是C++ 11中的lambda表达式?

什么是C++ 11中的lambda表达式?我什么时候用?他们解决了哪些问题在引入之前是不可能的?

一些示例和用例将是有用的.

c++ lambda c++-faq c++11

1408
推荐指数
7
解决办法
45万
查看次数

C++20模板lambas的限制和使用

C++ 标准专家的几个相关问题。

传入的 C++20引入了模板 lambdas ( P0428R2 )。

所以代替

auto x = [](auto x, auto y){ return x+y; };
Run Code Online (Sandbox Code Playgroud)

我们可以指定模板参数如下

auto x = []<typename T>(T x, T y){ return x+y; };
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。

第一个问题:模板 lambda 中的显式模板参数是否只能从参数中推导出来,或者是否可以添加非推导出的模板参数?

阅读 P0428r1 我没有看到任何明确的限制,但是,我也没有看到非推导模板参数的例子。

在第一个近似值中,我认为非推导的模板参数是合法的,因为我看到以下愚蠢的代码

int main()
 {   
   []<int = 0>(){ }();
 }
Run Code Online (Sandbox Code Playgroud)

使用 g++(10.0.0 head)和 clang++(10.0.0 head)编译和运行。

假设允许非推导的模板参数,第二个问题是:如何在提供模板参数的同时调用模板 lambda?

举例:给定以下模板 lambda

auto x = []<std::size_t I>(auto t){ return std::get<I>(t); };
Run Code Online (Sandbox Code Playgroud)

I没有显式命名的情况下调用此类 lambda 时,是否有一些语法用于指定模板参数operator()

我试过

x<0u>(y);
Run Code Online (Sandbox Code Playgroud)

但 …

c++ lambda language-lawyer generic-lambda c++20

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

为什么std :: apply失败了泛型函数?

cppreference中获取,为什么调用std::apply(add_generic, ...)无法编译?有办法解决吗?

#include <iostream>
#include <tuple>

int add(int first, int second)
{
    return first + second;    
}

template<typename T>
T add_generic(T first, T second)
{
    return first + second;    
}

int main()
{
    std::cout << std::apply(add, std::make_tuple(1,2)) << '\n';

    // template argument deduction/substitution fails
    std::cout << std::apply(add_generic, std::make_tuple(2.0f,3.0f)) << '\n'; 
}
Run Code Online (Sandbox Code Playgroud)

失败并出现错误:

[x86-64 gcc 7(快照)]错误:没有匹配函数调用'apply(,std :: tuple)'[x86-64 gcc 7(快照)]注意:无法推导出模板参数'_Fn'

c++ c++17

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

如何在 C++ 中使用原始数组成员概括从 std::array 到 struct 的转换?

在 C++ 中,我有这个来自 C 的结构。这段代码非常旧,无法修改:

struct Point {
   double coord[3];
};
Run Code Online (Sandbox Code Playgroud)

另一方面,我有这个现代函数,它返回现代std::array而不是原始数组:

std::array<double, 3> ComputePoint();
Run Code Online (Sandbox Code Playgroud)

目前,为了Point从返回值初始化 a,我手动从 中提取每个元素std::array

std::array<double, 3> ansArray{ComputePoint()};
Point ans{ansArray[0], ansArray[1], ansArray[2]};
Run Code Online (Sandbox Code Playgroud)

这个解决方案是可行的,因为只有三个坐标。我可以将其模板化为一般长度吗?我想要类似相反的转换:std::to_array

c++ arrays aggregate initialization stdarray

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