2013-10-17 3 views
3

내가 예 클래스가 있습니다합계 : 벡터 <Object> 회원 C++

class Example { 
private: 
    int testValue1; 
    int testValue2; 
    int testValue3; 

public: 
    Example(int pVal1, int pVal2, int pVal3); 

    Example(const Example); 

    const Example operator =(const Example); 

    inline int getValue1() { return testValue1; } 

    inline int getValue2() { return testValue2; } 

    inline int getValue3() { return testValue3; } 

}; 

소스 코드에서 나는 성병 한 : 예 개체의 벡터.

는, 표준 : 숫자 기능

뭔가 같이 벡터의 모든 Obejcts의 값 1의 합을 일부 표준 : 알고리즘으로 가능 : 표준 : 축적 (vector.begin(), 벡터 .END(), 0, SomeFunctorOrOthers) .... 물론

내가 반복자를 사용할 수 있습니다 ...하지만이 경우 가능한 II가

가 대단히 감사합니다 알고 싶어요! 당신이 int에 대한 운영자 캐스팅 과부하 경우

답변

2
std::accumulate(v.begin(), v.end(), 0); 

이 충분 :

의 단점은
class Example { 
    ... 

    operator int() { return testValue1; } 
}; 

, 당신은이 오버로드는 일반적으로 클래스에 적용하지 않을 수 있습니다.

+4

내가 않을 것 이것을 int에 암시 적으로 변환하는 것과 같이 일반적인 (그리고 위험한) 것으로 제공하는 좋은 이유라고 생각하십시오. –

+0

이것은 기술적으로 효과적이지만, 상당히 해킹 된 솔루션입니다 ... – Angew

+0

나 자신은 이것을 좋아하지 않지만 또 다른 접근 방식입니다. 'Example' 클래스는 예제 일 뿐이므로이 솔루션은별로 좋지 않을 수도 있습니다. – deepmax

7

물론 : Object 때문에 const를-REF 람다에 의해 전달되는,

int sum = 
std::accumulate (begin(v), end(v), 0, 
    [](int i, const Object& o){ return o.getValue1() + i; }); 

주, 당신은 게터 const (즉, 어쨌든 좋은 연습입니다) 확인해야합니다.

C++ 11이없는 경우 오버로드 된 functor를 정의 할 수 있습니다. operator(). 나는 더 나아가 당신은 쉽게 당신이 전화하고 싶은 게터의 결정할 수 있도록 그것을 템플릿을 만들 것입니다 : 알고리즘이 같은

template<int (Object::* P)() const> // member function pointer parameter 
struct adder { 
    int operator()(int i, const Object& o) const 
    { 
     return (o.*P)() + i; 
    } 
}; 

패스를 : adder<&Object::getValue2>()

3
std::accumulate(vector.begin(), vector.end(), 0, [](const int& a, Example& b) 
{ 
return a + b.getValue1(); 
}); 
+0

멤버 데이터 유형이 부동 상태 인 곳에서 작동하게 만드는 방법. – reubenjohn