私はテンプレート化された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));
}
この結果を達成する方法はありますか?