代码之家  ›  专栏  ›  技术社区  ›  Danvil

计算数据项时的内联代码(使用模板)

  •  0
  • Danvil  · 技术社区  · 14 年前

    有一个简单的POD数据类型,如

    struct Item {
       int value1;
       double value2;
       bool value3;
    }
    

    现在我想编写不同的计数函数,就像可以用以下代码(或一些std方法)来完成一样:

    typedef bool Selector(const Item& i);
    int count(const vector<Item>& items, Selector f) {
      int sum = 0;
      BOOST_FOREACH(const Item& i, items) {
        if(f(i)) {
          sum++;
        }
      }
      return sum;
    }
    

    f 例如

    bool someSimpleSelector(const Item& i) {
      return i.value1 > 0; // quite simple criterion
    }
    

    我的问题是:有没有可能实现上面的代码,编译器可以内联我的选择代码,但没有实现整个计数函数一次又一次明确(例如使用模板)?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Mike Seymour    14 年前

    更换 typedef 使用模板参数,要允许泛型functor:

    template <typename Selector>
    int count(const vector<Item>& items, const Selector &f)
    

    然后用函数对象替换函数:

    struct someSimpleSelector
    {
        bool operator()(const Item& i) const { return i.value1 > 0; }
    };
    

    您应该发现这是内联的,带有合适的编译器优化设置。

    顺便说一下,这个特殊的问题可以用 std::count_if() .

        2
  •  2
  •   bradgonesurfing    14 年前

    Selector f;
    int count = std::distance(items | boost::range::adaptor::filtered(f));
    

    更多详情请继续阅读。 http://www.boost.org/doc/libs/1_43_0/libs/range/doc/html/range/reference/adaptors/reference/filtered.html