1

変換をテンプレート クラスで動作させることができない理由を見つけるのに苦労しています。

テンプレート クラスの簡略版を次に示します。

template<typename T>
class base
{
public :
  base() : all_() {}
  ~base() {}
public:
  bool add(T t)
  {
    typename vector<T>::iterator itr 
      = lower_bound(all_.begin(), all_.end(), t);
    if ( itr == all_.end() || *itr != t )
      {
        all_.push_back(t);
        cout << "ok" << endl;
        return true;
      }
    cout << "failed" << endl;
    return false;
  }
  static bool addTo(base<T> *c, T t)
  {
    return c->add(t);
  }
private :
  vector<T> all_;
};

そして、これは私がトランスフォームを使用して、メンバー追加関数からのすべてのブール出力をキャプチャしようとしている場所です:

main()
{
  base<int> test;
  vector<bool> results;
  vector<int> toAdd;
  toAdd.push_back(10);
  toAdd.push_back(11);
  toAdd.push_back(10);
  transform( toAdd.begin(), toAdd.end(),
             back_inserter(results),
             bind1st( (bool(*)(base<int>*,int))base<int>::addTo, &test ) );
}

目的は、base::add または base::addTo のいずれかを使用して toAdd コンテナーの各メンバーを挿入し、bool の結果をベクターの結果にキャプチャすることです。

4

2 に答える 2

6

試す:

  transform( toAdd.begin(), toAdd.end(),
         back_inserter(results),
         bind1st( mem_fun(&base<int>::add), &test ) );

問題はテンプレートではなく、bind1st が機能するために追加のサポートに依存していることです ( http://www.sgi.com/tech/stl/AdaptableBinaryFunction.htmlを参照)。私の知る限り、単純な古い関数ポインターでは操作できません。

boost::bindただし、この状況では必要ありません。mem_fun非静的メンバー関数を適応可能なバイナリ関数に変換します。addToしたがって、どちらも必要ありませんが、同様の状況で静的メンバー関数を使用する必要がある場合は、ptr_fun.

于 2009-11-27T17:30:49.550 に答える
0

以下を基本クラスに追加します。

typedef base<T>* first_argument_type;
typedef T second_argument_type;
typedef bool result_type;

bool operator () (base<T> *c, T t) const {
    return c->add(t);
}

変換を次のように変更します。

transform(toAdd.begin(), toAdd.end(),
          back_inserter(results), bind1st(base<int>(), &test ));
于 2009-11-27T17:34:54.317 に答える