在结构中调用 lambda 函数
Calling to lambda function in 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
一起使用来计算地图第一个索引的总和。这是代码:
main.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::function
的签名。
此外,lambda 本身也被破坏了,因为 T
不能既是一个值又是一对值。像
std::function<T(T, std::pair<T, T> const &)> fun =
[](T value, std::pair<T, T> const & pair)
{
return value + pair.first;
};
可行,但我不确定这是否是您想要完成的。
我有一个定义 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
一起使用来计算地图第一个索引的总和。这是代码:
main.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::function
的签名。
此外,lambda 本身也被破坏了,因为 T
不能既是一个值又是一对值。像
std::function<T(T, std::pair<T, T> const &)> fun =
[](T value, std::pair<T, T> const & pair)
{
return value + pair.first;
};
可行,但我不确定这是否是您想要完成的。