谁能告诉我为什么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)
{
}
答案 0 :(得分:2)
&std::get<2>(arg)
返回Value
对象本身的内存地址,而不是其保存的ptr_
的值 < sup> 1 。该地址永远不会为空。
1:除非Value
覆盖operator&
以返回ptr_
,否则不应这样做!
您需要删除&
,以便比较实际的Value
对象。但这仅在Value
已实现operator==
接受T*
(其中T
是ptr_
类型)或{{ 1}}作为输入,并将其与nullptr_t
进行比较。否则,您的lambda必须直接访问和比较ptr_
。
您还应该通过引用而不是通过值传递lambda的ptr_
参数,以便对存储在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_
是T
的类型),则可以执行以下操作:
ptr_
答案 1 :(得分:0)
因为&std::get<2>(arg)
永远不会是nullptr
。实际上,您正在获得指向&
返回的某些Value &
的指针(带有std::get<2>(arg)
)。