는 :원시 포인터와 스마트 포인터를 모두 허용하는 C++ 펑터를 작성할 수 있습니까? 주어진 다음의
struct Foo
{
int bar() const;
};
struct IsEqual : public std::unary_function<Foo*, bool>
{
int val;
IsEqual(int v) : val(v) {}
bool operator()(const Foo* elem) const
{
return elem->bar() == val;
}
};
나는 Foo*
의 컨테이너를하고 난 컨테이너의 모든 요소가 있는지 확인하기 위해 std::find_if
및 std::not1
를 사용하는 경우 주어진 값과 다른 bar()
반환 뭔가. 이번에는 std::tr1::shared_ptr<Foo>
을 포함, 미래로
// Are all elements equal to '2'?
bool isAllEqual(const std::vector<Foo*> &vec)
{
return find_if(vec.begin(), vec.end(), std::not1(IsEqual(2))) == vec.end();
}
빨리 감기와 지금은 다른 용기를 가지고 : 코드는 다음과 같습니다. isAllEqual()
의 오버로드 된 버전에서 필자의 펑터를 간단히 다시 사용하고 싶습니다. 그러나 나는 할 수 없다. Foo*
및 shared_ptr<Foo>
은 다른 유형입니다. 그리고 unary_function
에서 상속해야하므로 not1
을 사용할 수 있습니다. 같은 펑터를 두 번 쓰는 것을 피할 수 있다면 더 우아 할 것입니다.
질문 :
IsEqual
는 그래서 모두 원시와 스마트 포인터를 사용하여 쓸 수있는 방법이 있나요?std::not1
을 사용하여 수갑을 채웠습니까? 대신IsNotEqual
을 작성해야합니까?
제한 :
- 내가 부스트 라이브러리에서 아무것도를 사용할 수 없습니다.
- 우리의 컴파일러는 C++ 0x lambdas를 지원할 정도로 멋지지 않습니다.
이 예제는 템플릿이 좋을 것처럼 들립니다. – GWW
@Kristo : 컴파일러가'std :: begin'과 같은 다른 C++ 0x 자료를 제공 할만큼 충분히 멋지습니까? –
@Ben, 우리는 gcc 4.1.2를 사용하고 있습니다. 'std :: begin'과'std :: end'는 간단히 작성해야합니다. –