0

私はテンプレート化されたoperator+=関数を作成し、それに一意の名前空間を与えました (私は時々それを使用したいだけで、これにより明示的に使用できます)。

次に、オペランドで使用する別のテンプレート関数内でその関数を使用たいと思いますが、プログラムのどこかで実行operator+=するすべての呼び出しに飛びつくのを待って、シンボルテーブルにぶら下がったままにしたくありません。+=また、広く含まれているヘッダー内でこれを行う必要があります。

これの基本的な例は次のとおりです。

#define BOOST_RESULT_OF_USE_DECLTYPE

#include "boost\range.hpp"
#include "boost\range\algorithm.hpp"
#include <vector>

using std::vector;

namespace range_ops
{
    template <class ForwardRange1, class SinglePassRange2>
    inline ForwardRange1& operator+=(ForwardRange1& left, const SinglePassRange2& right)
    {
        auto left_it = boost::begin(left);
        auto right_it = boost::begin(right);
        for (; left_it != boost::end(left); ++left_it, ++right_it)
            *left_it += *right_it;

        return left;
    }
}

template <class SinglePassRange, class Value>
inline Value accumulate_increment(SinglePassRange& rng, Value val)
{
    typedef typename boost::range_value<SinglePassRange>::type range_val;
    boost::for_each(rng, [&](const range_val& x) { val += x; });
    return val;
}

template <class SinglePassRange>
inline typename boost::range_value<SinglePassRange>::type accumulate_increment(SinglePassRange& rng)
{
    return accumulate_increment(rng, typename boost::range_value<SinglePassRange>::type());
}

//using range_ops::operator+=; // this works, but pollutes the global namespace with a templacised operator+= function - yuck!
int main()
{
    auto i = accumulate_increment(vector<int>(1)); // works fine

    using range_ops::operator+=; // want this here, but accumulate_increment can't see the operator+= function
    auto j = accumulate_increment(vector<vector<int>>(1));
}

この結果を達成する方法はありますか?

4

2 に答える 2

0

これができたとしても、お勧めしません。コードを使用する人は、オブジェクトの内部動作が、オブジェクトに明示的に渡されず、オブジェクトと共に動き回らない外部状態 (名前空間の設定) に依存しないことを期待する必要があります (地理的にどこにあるかに依存するものではありません)。ソース ファイル内)。

演算子のオーバーロードは、オペランドが通常その演算子を本質的にサポートしないものである場合を除いて、物事を混乱させることに近い機能です。

このようなものを実装する場合は、メンバー SetOtherOperatorOverload(TRUE); など、オーバーロードするオペレーターの動作を変更するオブジェクトの状態を設定する必要があります。

于 2011-10-18T02:55:25.367 に答える
0

インクリメント関数は 1 つしかないので、呼び出し側で句を使用してインクリメント関数自体に影響を与えるとどのように期待していましたか? operator+ を見つけるにはどうすればよいでしょうか?

于 2011-10-18T02:33:03.267 に答える