2012-03-02 3 views
1

다음에 의견을 보내 주셔서 감사합니다.포인터의 목록에 회원 기능이 있습니다

Class1 { debug(std::ostream&){} }; 
int main() { 
    std::vector<Class1*> list1; 
    // some work to do 
} 

대상 플랫폼 :

  • 플랫폼 (1) 승 7x64, VS2010
  • 플랫폼 (2) : 리눅스 X32, g ++ 4.4

Q : 다음 문장에 "std :: cout"을 전달하는 올바른 방법은 무엇입니까?

std::for_each(list1.begin(), 
       list1.end(), 
       "afunction(&Class1::debug, std::cout)"); 

내가 이전 디버그() 함수 내에서 "표준 : : cout을"을 사용하지만, 나중에 디버그 메시지의 출력을위한 유연성을 제공하는 것이 좋습니다.

편집 : 추가 정보 : 펑터 객체가 있다면, 여러 클래스에 대응하기 위해 펑터를 어떻게 구현해야합니까? (이들 클래스는 같은 "디버그"함수 서명을 제외하고는 아무 관계도 없습니다)?

편집 (2) : "std :: for_each"를 사용하면 각 클래스에 해당하는 소멸자를 직접 호출하여 list1의 모든 객체를 파괴 할 수 있습니까? (예를 들면의 for_each (l.begin(), l.end(), "클래스 :: ~ 클래스 1");

편집 (3) 제안 "PMR"당, 나는

std::for_each(l.begin(), 
       l.end(), 
       std::bind2nd(std::mem_fn(&Class1::debug), out)); 
과 같은 성명을 발표 이진 '< <'

그것은 컴파일 및 리눅스 플랫폼에서 제대로 실행하지만, VS2010에 실패, 코드는 클래스 1 : 디버그위한 VS 오류 MSG가

오류 C2678입니다

void Class1::debug(const std::ostream& out) 
{ 
    out << "some text" << someVar << "some text" << std::endl; 
} 

입니다 : 오퍼레이션 없음 'const std :: ostream'타입의 왼쪽 피연산자를 취하는 (또는 받아 들일 수있는 변환이 없음) 발견 된 ator가 발견되었습니다 (또는 받아 들일 수있는 변환이 없습니다)

어떤 큐가 있습니까?

[닫힌] 이제 내 클래스에 오버로드 된 연산자 < <이 구현되었으며 디버그 인쇄 기능이 사용되지 않습니다. 주어진 모든 힌트를 주셔서 대단히 감사드립니다.

답변

1

당신이 첫 번째 선택이 될 것 람다 표현식을 사용할 수 없습니다 g ++ 4.4을 사용하고 있기 때문에이 (이상 버전을 지원, MSVC도 않습니다).

그래서 펑터가 필요합니다. functor는 operator()을 구현하는 클래스 (또는 구조체) 인 함수 객체입니다.이처럼 :

class Debug 
{ 
public: 
    Debug(ostream& os) : _os(os) 
    { } 

    void operator()(Class1* instance) 
    { 
      // will print the pointer, replace with user code 
      os << instance << endl; 
    } 
private: 
    ostream& _os; 
}; 

사용과 같은 : GCC으로

Debug d(cout); 
std::for_each(list1.begin(), list1.end(), d); 
0

은 함수 포인터 대신 람다를 사용합니다. 이것은 C++ 11x의 기능이며 컴파일러가 람다를 인식 할 수 있도록 플래그를 포함해야합니다.

std::for_each(list1.begin(), list1.end(), [&debug, &cout] 
{ 
// implementaion 
} 
); 
0

4.5까지 람다를 지원하지 않습니다, 깨끗한 해결책은 밖으로 질문입니다.

for_each(list1.begin(), list.end(), _1->debug(cout)); 

그리고 마지막으로, 지루한 펑터 솔루션 : 개인적으로

class Output 
{ 
public: 
    explicit Output(ostream& ios) : os(&ios) 
    { 
    } 

    void operator()(Class1* obj) 
    { 
      obj->debug(*os); 
    } 

private: 
    ostream* os; 
}; 
for_each(list1.begin(), list1.end(), Output(cout)); 

내가 생각

당신은 일반적인 알고리즘을 많이 사용하려는 두 번째 쉬운 해결책

은 Boost.Lambda http://www.boost.org/doc/libs/1_49_0/doc/html/lambda.html입니다 C++ 11 람다 또는 람다 부스트 없이는 for_each는 가치가있는 것보다 더 고통 스럽습니다.

for (vector<Class1*>::iterator it = list1.begin(); it != end; ++it) 
    (*it)->debug(cout); 
0

C++ : 03 :뿐만 아니라 간단한 루프를 할 수 있음

#include <vector> 
#include <functional> 
#include <iostream> 
#include <algorithm> 

struct Foo { 
    void debug(std::ostream&) {} 
}; 

int main() 
{ 
    std::vector<Foo*> foos; 
    std::for_each(foos.begin(), foos.end(), 
       std::bind2nd(std::mem_fun(&Foo::debug), std::cout)); 
    return 0; 
} 

바인더는 사용되지 않으며 boost::bind 또는 C++ (11)가 선호되어야 함을 유의하시기 바랍니다. 당신은 정말로 새로운 컴파일러를 얻어야합니다.

+0

나는 당신의 제안에 따라 몇 가지 점으로 컴파일하지만 MS VS2010에서 오류 "오류 C2678 : binary '<<'가 발생했습니다 : 'const std :: type'의 왼쪽 피연산자를 사용하는 연산자가 없습니다. ostream '(또는 받아 들일 수있는 변환이 없습니다) " –

+0

예제 코드에서 연산자 <<를 볼 수 없습니다. 문제는 아마 당신이 출력하는 방식입니다. 'ostream'을'const &'로 대신'&'로 사용하십시오. 이것은 그것을 고쳐야한다. – pmr

관련 문제