gpt4 book ai didi

c++ for_each() lambda 函数不正确

转载 作者:行者123 更新时间:2023-11-28 01:26:28 25 4
gpt4 key购买 nike

谁能告诉我为什么 for_each() 在下面的代码中不起作用。

我需要它来检查元组中的第三个元素是否不是 nullptr,如果不是,则将第一个和第三个元素添加到 list

但是,它似乎是将所有元素添加到list

std::vector<std::tuple<std::string, std::type_index, Value>> arguments;


std::vector<std::pair<std::string, mv::Value>> class::defaultValues() const
{
std::vector<std::pair<std::string, Value>> list;
list.reserve((arguments.size()));

std::for_each(arguments.begin(), arguments.end(),[&list](std::tuple<std::string, std::type_index, Value> arg)
{
if (&std::get<2>(arg) != nullptr)
list.push_back(make_pair(std::get<0>(arg),std::get<2>(arg)));
}
);
return list;
}

更新:

Value 是一个类。

为它调用默认构造函数,它将 ptr_ 填充为 nullptr

Value() : ptr_(nullptr)
{

}

最佳答案

&std::get<2>(arg)返回 Value内存地址对象本身,而不是 ptr_它拥有 1。该地址永远不会为空。

1:除非Value覆盖 operator&返回 ptr_ ,这是不应该做的!

您需要删除 &所以你在比较实际的Value目的。但这仅在 Value 时才适用于您的示例已实现operator==采取T* (其中 Tptr_ 的类型)或 nullptr_t作为输入并将其与 ptr_ 进行比较.否则,您的 lambda 将不得不访问和比较 ptr_直接代替。

您还应该传递 lambda 的 arg通过引用而不是通过值来传递参数,以便您对原始 tuple 进行操作存储在 arguments ,而不是它的拷贝

试试这个:

std::for_each(arguments.begin(), arguments.end(),
[&list](std::tuple<std::string, std::type_index, Value> &arg)
{
if (std::get<2>(arg) != nullptr) // or std::get<2>(arg).ptr_, depending on how Value is implemented
list.push_back(std::make_pair(std::get<0>(arg), std::get<2>(arg)));
}

在这种情况下,我建议制作 Value实现 operator!相反(如果还没有)返回它是否为 ptr_nullptr ,那么你可以这样做:

std::for_each(arguments.begin(), arguments.end(),
[&list](std::tuple<std::string, std::type_index, Value> &arg)
{
if (!!std::get<2>(arg))
list.push_back(std::make_pair(std::get<0>(arg), std::get<2>(arg)));
}

或者,执行 operator bool返回是否ptr_不是 nullptr , 或实现 operator T*返回 ptr_相反(其中 Tptr_ 的类型),那么您可以这样做:

std::for_each(arguments.begin(), arguments.end(),
[&list](std::tuple<std::string, std::type_index, Value> &arg)
{
if (std::get<2>(arg))
list.push_back(std::make_pair(std::get<0>(arg), std::get<2>(arg)));
}

关于c++ for_each() lambda 函数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53545982/

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