2013-03-27 5 views
4

std :: transform을 사용하여 루프를 단순화하려고합니다. 여기에 몇 가지 코드가 있습니다 :참조로 전달 된 추상 클래스로 bind를 사용하는 방법

class ITest 
{ 
public: 
    virtual CPrueba Prueba(double p, double d = 0)const = 0; 
}; 

void foo(const ITest& test) 
{ 
    std::vector<double> v; 
    std::vector<CPrueba> vRes; 
    // ... 
    // ... 
    std::transform(v.begin(), v.end(), back_inserter(vRes), 
        bind(&ITest::Prueba, test, _1, 0)); 
    //... 
} 

이것은 컴파일되지 않습니다.

저는 VS2008 SP1을 사용하고 있으며 이해할 수없는 많은 템플릿 오류가 발생했습니다. 따라서 I've tried in ideone (gcc 4.7.2)입니다. 거기에 좀 더 읽을 수있는 오류가있어 ITest와 추상적 인 관계가 있다고 결론을 내 렸습니다.

하지만 테스트 개체를 전달하는 방법을 변경하여 시도한 결과, 내가 수행하면 by pointer, it works입니다.

함수 서명을 유지하고 루프 대신 바인드 변환을 사용하는 데 사용할 수있는 것이 있습니까?

답변

4

std::bind은 각 인수의 유형을 std::decay 내부적으로 저장합니다. test을 전달하면 ITest 유형의 객체를 저장하려고 시도합니다. 이는 물론 추상적입니다.

이 객체에 좌변 참조 저장 std::bind 원인이 당신이하는 std::reference_wrapper에 싸여 test를 통과하면 그것은 작동합니다 : 당신은 다른 방법 객체에 대한 포인터를 전달할 수 있습니다

std::transform(v.begin(), v.end(), back_inserter(vRes), 
       bind(&ITest::Prueba, std::ref(test), _1, 0)); 

std::bind이를 받아들이으로, too

std::transform(v.begin(), v.end(), back_inserter(vRes), 
       bind(&ITest::Prueba, &test, _1, 0)); 
+0

감사합니다. 내 컴파일러는 ref 버전을 좋아하지 않는 것 같습니다. – MikMik