2

名前付き関数を引数として別の関数に送信し、引数をフェニックスラムダ式に含める方法がわかりません。

これが私が考えることができる最小限の例です。

#include <vector>
#include <iostream>
#include <algorithm>
#include <boost/phoenix.hpp>

using namespace std;
namespace ph = boost::phoenix;
using ph::arg_names::arg1;

template <typename Predicate>
void foo(vector<int> &v, Predicate p) {
  for_each(v.begin(), v.end(),
      if_(p(arg1))
      [
        cout << "found " << arg1 << ", "
      ]);
  cout << endl;
}

bool is_odd(int i) {
  return (i % 2 == 1);
}

main() {
  vector<int> v(10);
  int i = 1;
  generate(v.begin(), v.end(), ph::ref(i)++);
  cout << "looking for odd ones ";
  foo(v, arg1 % 2 == 1);

  cout << "using named function ";
  //foo(v, is_odd);
  //foo(v, &is_odd);
  //foo(v, ph::bind(&is_odd, arg1));
  //foo(v, boost::bind(&is_odd, _1));
}

is_odd()関数をfoo()述語として送信する方法がわかりません。

注: 私の実際のコードでは、述語は実際にはarg1( arg1is ofclass Barであり、述語として必要ですBar::is_odd) のメンバー関数です。(arg1->*&Bar::is_odd)()スタイルを試してみましたが、うまくいきませんでした。簡単にするために、この例にはこれを含めていません。

更新: これは同じコードの C++11 バージョンです。これはうまく機能しますが、C++ 11を使用できないため、phoenixで機能させたいと考えています

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

template <typename Predicate>
void foo(vector<int> &v, Predicate p) {
  for_each(begin(v), end(v),
      [&] (int i) {
        if (p(i))
          cout << "found " << i << ", ";
      });
  cout << endl;
}

bool is_odd(int i) {
  return (i % 2 == 1);
}

main() {
  vector<int> v={1,2,3,4,5,6,7,8,9,10};
  cout << "looking for odd ones ";
  foo(v, [] (int i) {return (i%2 == 1);});

  cout << "using named function ";
  foo(v, &is_odd);
}
4

1 に答える 1