2

要素のコンテナーがあり、各要素にはsize()メンバー関数があります。二項演算を記述して、コンテナー要素の合計サイズを累積することができましたadd_size

#include <algorithm>
#include <vector>
#include <functional>
#include <numeric>
#include <iostream>

class A
{
    int size_ ; 

    public: 

        A ()
            :
                size_(0)
        {}

        A (int size)
            :
                size_(size)
        {}

        int size() const
        {
            return size_; 
        }
};

template<typename Type>
class add_element 
{
    Type t_; 

    public: 

        add_element(Type const & t)
            :
                t_(t)
        {}

        void operator()(Type & t)
        {
            t += t_; 
        }
};

int add_size (int i, const A& a)
{
    return i+=a.size();
}

using namespace std;

int main(int argc, const char *argv[])
{

    typedef vector<A> Vector;

    Vector v; 

    v.push_back(A(10));
    v.push_back(A(5));
    v.push_back(A(7));
    v.push_back(A(21));
    v.push_back(A(2));
    v.push_back(A(1));

    int totalSize = accumulate(v.begin(), v.end(), 0, add_size);

    std::cout << totalSize << endl;

    return 0;
}

これにより、正しい出力が得られます。

46

私が望むのは、サイズ メンバー関数のためだけに二項演算を定義せずに、mem_fun とバインダーを使用してそれを行うことです。add_sizeどうやってやるの?どうすれば効果的にそれを行うことができますか? 私はから始めてadd_element行き詰まりました。

C++03 で動作するソリューションが必要です。

4

1 に答える 1

2

あなたの質問は不適切だと思います。あなたが持っているものを見てください:小さなワンライナー関数 add_sizeと への呼び出しstd::accumulate. 好きではないことは何ですか?

どういうわけか (おそらく企業の理由で)、Boost.Bind または Boost.Lambda の使用が制限されていますstd::bind

表現力がひどく制限されている C++03 バインダーを優先してそれを排除したい(これが、Boost.Bind と Boost.Lambda が非常に人気があった理由の 1 つです)。現在持っているものよりもはるかに多くのボイラープレートが必要になります。 . Nicolai Jusuttis による C++ Standard Reference bookのこの付録を見てください。彼は、友達と「うまく」機能する一般的なテンプレートを実装しています。しかし、彼がそれを実装するために使用するヘッダーを見てください。そうです、Boost.Bind ヘッダーです。composestd::bind2nd

最善の方法は、単純にBoost.Bind および/または Boost.Lambda をコピーし、それらを独自のソース ツリーに配置し、名前空間を自社の名前に変更することです。これが実際にBoost Licenseと一致しているかどうかを確認してください。Boost にはbcp、含まれているすべての依存関係を抽出するツールもあります。次に、「記述」したバインドまたはラムダ機能を使用して、必要なものをすべて記述します。

TL;DR : 車輪を再発明しないでください。Boost に慣れてください。

于 2013-05-08T12:58:53.153 に答える