나는 templacised 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));
}
있습니까?
템플릿 기능은 호출 사이트에서만 인스턴스화되기 때문에 함수를 처음 호출 할 때만 표시하면됩니다. 문제는 템플릿 함수가 처음 사용 된 실제 줄이 아니라 호출하는 함수의 시작에서 템플릿 함수가 인스턴스화된다는 것입니다. 따라서 함수 자체에서 선언을 사용하면 템플릿 함수가 인스턴스화 될 때 고려되지 않습니다. – Ayjay
Ayjay - 내 약한 대답보다는 오히려 그 대답으로 게시해야합니다. –
아, 대답이 아니므로, 왜 어려운지에 대한 설명입니다. 나는 그 주위에 방법이 있는지 묻고 싶다! – Ayjay