0

请考虑这个非编译代码:

#include <boost/range/adaptors.hpp>

class Stuff {
 public:
  bool var;
};

class Manager {
 /// Get everything
 std::vector<Stuff*>
 get_all_stuff() const
 {
   return list_of_stuff;
 }

 /// Get a vector of only those that whose "var" matches the "tf" argument.
 std::vector<Stuff*>
 get_some_stuff(const bool tf) const
 {
   return (get_all_stuff() |
     boost::adaptors::filtered(
       [](Stuff const& s) { return (s.var == tf); }
     )
   );
 }

 private:
  std::vector<Stuff*> list_of_stuff;
};

编译因此错误而死:

ex.cc: In lambda function:
ex.cc:21:46: error: ‘tf’ is not captured
        [](Stuff const& s) { return (s.var == tf); }
                                              ^

1.) 如何将该函数参数带入我的 lambda?

2.) 这是一种危险的方法吗?我应该改用 std::remove_copy_if() 吗?

  • 我不担心“get_all_stuff()”返回的向量的生命周期。
  • 我担心“get_some_stuff()”返回的向量的生命周期。
4

1 回答 1

1

要将外部值放入 lambda,您必须捕获它。

[&tf](Stuff const& s) { return (s.var == tf);

boost::adaptors::filter在示例中使用过。但是 ether one 将返回一个范围,而不是一个向量对象。如果要返回与 不同的向量,list_of_stuff则必须构建它。如果你从你的函数中返回它,编译器会尽可能移动它。这是一个关于 coliru 的工作示例

#include <iostream>
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>

class Stuff {
public:
    bool var;
    int id;
};
std::ostream& operator << (std::ostream& os, const Stuff stuff) {
    return os << std::boolalpha << stuff.id << " " << stuff.var;
}
using vector_type = std::vector<Stuff>;

class Manager {
    /// Get everything
public:
    auto get_all_stuff() const
    {
        return list_of_stuff;
    }

    // Get a vector of only those that whose "var" matches the "tf" argument.
    vector_type get_some_stuff(const bool tf) const
    {
        vector_type temp;
        for (auto item : boost::adaptors::filter(list_of_stuff,
            [&tf](Stuff const& s) { return s.var == tf; }))
            temp.push_back(item);
        return temp;
    }

private:
    vector_type list_of_stuff = { {false,1},{true,2},{false,3},{true,4},{true,5} };
};
int main()
{
    Manager manage;
    for (const auto item : manage.get_all_stuff())
        std::cout << item << " ";
    std::cout << std::endl;
    for (const auto item : manage.get_some_stuff(true))
        std::cout << item << " ";
    std::cout << std::endl;
}
 
于 2020-09-04T01:06:44.620 回答