5

次のように、カウントを返す関数を持つクラスがあります。

class CTestClass
{
public:
    // ...
    size_t GetCount()const;
    // ...
};

そして、私のプログラムのどこかに、そのクラスのオブジェクトのベクトルがあります。通常のループのように実装された、合計カウント(CTestClass :: GetCount()の結果の合計)を取得する関数があります。

size_t sum = 0;
for(vector<CTestClass>::const_iterator it = v.begin(); it != v.end(); ++it)
{
    sum += it->GetCount();
}

標準ライブラリで利用できる機能を利用するようにリファクタリングしたいので、と思いましたaccumulate。関数オブジェクトを使用して(簡単に)実行できましたが、別のオブジェクトを宣言しなくても実行できるとほぼ確信しています(C ++ 11またはブーストがないため、ラムダはありませんが、 TR1を持っている)。
答えを探しているとき、私はこれらのリソースを見つけましたが、それらは質問を解決しません:

  • これはほとんど同じ質問であり、提供される答えはループ、アキュムレートとファンクター、アキュムレートとラムダですが、バインドなどへの未回答の参照があります。
  • 同様の質問に対するこの回答では、、、accumulateおよびplusを 使用bindしていますが、メンバー関数の代わりにデータメンバーを使用しています。

それで、bindまたは同様のものを使用してこれを行う方法はありますか?

4

2 に答える 2

7

私は次のことがうまくいくと思います:

using namespace std;
using namespace std::tr1;
using namespace std::tr1::placeholders;

accumulate(v.begin(), v.end(), 0,
           bind(plus<size_t>(), _1, bind(&C::GetCount, _2))
);
于 2011-12-07T12:25:18.557 に答える
2

これも機能します:

class CTestClass
{
public:
    // ...
    size_t GetCount()const;
private:
    operator size_t() { return GetCount(); }
    // ...
    template <typename InputIterator, typename T>
    friend T std::accumulate(InputIterator, InputIterator, T);

};


std::vector<CTestClass> v;
// fill vector

size_t result = std::accumulate(v.begin(), v.end(), 0);

TR1なし、バインドなし:)

于 2011-12-07T12:43:48.017 に答える