【问题标题】:How to pass an object data member to a lambda function in C++?如何将对象数据成员传递给 C++ 中的 lambda 函数?
【发布时间】:2021-04-16 20:43:57
【问题描述】:

假设我有以下非工作代码(仅用于说明目的):

class fruit
{
    public:

    std::string apple;
    std::string banana;
    std::String orange;
};

class grocery
{
    public:
    
    std::vector<fruit> g_items;
    std::string total_weight;   
};

std::vector<grocery> shopping; 

auto check_item = [&](std::string f_itm) -> void
{
    for (std::size_t i = 0; i < shopping.g_items.size(); ++i)
    {
        std::cout << shopping.g_items.at(i).f_itm << std::endl;
    }
};

check_item(apple);
check_item(banan);
check_item(orange)

我如何调用 lambda 函数 check_item,传递 fruit 对象的特定数据成员,因为它们都具有相同的类型 (std:string)?

谢谢。

【问题讨论】:

  • 我猜您希望能够使用指向 fruit(?) 的 std::string 数据成员的指针调用 lambda 如果是这样,请将 lambda 参数类型更改为 std::string (fruit::*f_itm)并将其称为例如check_item(&amp;fruit::apple)。除此之外,我真的不明白这个问题。
  • 然后在 lambda 内部,您可以像这样使用 f_itm 指针:std::cout &lt;&lt; shopping[i].g_items[j].*f_itm &lt;&lt; std::endl;
  • @G.M.确切地。 Remy 和 Eduardo 已经回答了这个问题。谢谢大家。

标签: c++ lambda pointer-to-member


【解决方案1】:

试试这个:

#include <string>
#include <vector>
#include <iostream>

class fruit
{
public:

    std::string apple;
    std::string banana;
    std::string orange; //std::string, not std::String
};

class grocery
{
public:
    std::vector<fruit> g_items;
    std::string total_weight;
};

std::vector<grocery> shopping;


auto check_item = [&](std::string(fruit::* f_itm)) -> void
{
    for (std::size_t i = 0; i < shopping.size(); ++i) //you have two, vectors, so first iterate through shopping
    {
        for (std::size_t j = 0; j < shopping[i].g_items.size(); ++j) //then, iterate through g_items 
            std::cout << shopping[i].g_items[i].*f_itm << std::endl; //then, print
    }
};

int main() {
    check_item(&fruit::apple); 
    check_item(&fruit::banana); //you put banan, not banana
    check_item(&fruit::orange); //remember the ;
}

您的原始代码有几个错误。然后,在你的 for 循环中,你有两个迭代两个向量,正如 cmets 解释的那样。然后,它应该可以工作了。

【讨论】:

  • 感谢您的更正和解决方案。这正是我所需要的。这只是一个测试用例,而不是实际代码。
【解决方案2】:

更改 lambda 以接收指向成员的指针,例如:

class fruit
{
public:
    std::string apple;
    std::string banana;
    std::string orange;
};

class grocery
{
public:
    std::vector<fruit> g_items;
    std::string total_weight;   
};

std::vector<grocery> shopping; 

...

auto check_item = [&](std::string (fruit::*f_itm)) -> void
{
    for (auto &g : shopping)
    {
        for (auto &f : g.g_items) {
            std::cout << f.*f_itm << std::endl;
        }
    }
};

check_item(&fruit::apple);
check_item(&fruit::banana);
check_item(&fruit::orange);

Demo

【讨论】:

    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    相关资源
    最近更新 更多