c++ - 在结构中调用 lambda 函数

标签 c++ c++11 lambda structure

我有一个定义 lambda 函数的结构。下面是该结构的代码

AccumulateUtils.cpp 文件

#include <functional>

template <typename T>
struct AccumulateUtils {
        std::function<T()> add_first = [] (T value, const T& pair) {
            return value + pair.first;
        };
};

main() 中,此结构与 std::accumulate 一起用于计算 map 第一个索引的总和。这是代码:

ma​​in.cpp 文件

#include <iostream>
#include <map>
#include <numeric>
#include "AccumulateUtils.cpp"

int main() {
    std::map<double, int> data = /*some map*/;
    AccumulateUtils<double> utils;

    std::cout << std::accumulate(data.begin(), data.end(), 0.0, utils.add_first);

    return 0;
}

Compiler 给出以下错误:

Error C2228 left of '.first' must have class/struct/union
Error C2664 'std::function::function(std::function &&)': cannot convert argument 1 from 'AccumulateUtils::' to 'std::nullptr_t

为什么会出现这些错误?代码有什么问题?

最佳答案

您的 lambda 函数的签名 ???(T, T const &) 不能隐藏到 T()std 的签名::函数。 此外,lambda 本身也被破坏了,因为 T 不能既是一个值又是一对值。有点像

std::function<T(T, std::pair<T, T> const &)> fun = 
[](T value, std::pair<T, T> const & pair)
{
  return value + pair.first;
};

有效,但我不确定这是否是您想要完成的。

关于c++ - 在结构中调用 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44969290/

相关文章:

c++ - 我在哪里设置内存屏障以便条件循环观察多线程值变化?

c++ - Boost Spirit Qi,我有一个解析器,我想将其映射到结构 "dynamically"(意味着参数的顺序不固定)

c++ - 关于发送/接收的问题

c++ - strstream 和 stringstream 的区别

c++ - 避免原始循环并改用 std::algorithm

c++ - 不使用 std::function 将捕获的 lambda 转换为函数指针

java - 如何减少 Java parallelStream 中的线程数?

c++ - 为什么 MSVC 在执行此位测试之前会发出无用的 MOVSX?

c++ - std::move 和 unique_ptr::reset 之间有什么区别?

C# Lambda 表达式 - 从字符串获取属性值