2014-03-26 3 views
0

이 구조체가 있습니다.find_if에 술어 사용

struct MaxWinPerElementInfo 
{ 
    std::string paytableName; 
    std::string elementName; 
    long long elementCredits; 
    bool  multiplierRequired; 
}; 

paytableName과 일치하는 요소를 찾고 싶습니다. 이를 위해 std::find_if을 술어 기능과 함께 사용할 계획이었습니다.

난 이제 호출하여 요소를 검색하는 시도
bool operator() (const MaxWinPerElementInfo &elementInfo) const 
{ 
    return paytableName == elementInfo.paytableName; 
} 

struct MaxWinPerElementInfo 내의 기능 개체, elementInfostd::vector< struct MaxWinPerElementInfo >paytablestd::string이다

std::find_if(elementInfo.begin(), elementInfo.end(), MaxWinPerElementInfo(paytable));

선언. 이것은 레거시 코드 때문에

이 들어

나는 오류가 발생하고, no known conversion for argument 1 from ‘std::string {aka std::basic_string<char>}’ to ‘const MaxWinPerElementInfo&’

나는 ++ 11 c를 사용할 수 없습니다.

내가 여기에 누락 되었습니까? 어떤 제안이라도 도움이 될 것입니다.

답변

3
std::find_if(elementInfo.begin(), elementInfo.end(), 
    MaxWinPerElementInfo(paytable)); 

문자열을 전달하여 MaxWinPerElementInfo을 생성하려고합니다. 문자열을 사용하는 생성자가 있습니까? 나는 컴파일러가 const MaxWinPerElementInfo 참조를 취하는 복사 생성자를 호출하려고 시도하지 않았다고 생각한다. 단일 인수를 취하는 생성자가 정의되지 않은 경우 컴파일러는 알고있는 유일한 생성자로 되돌아갑니다. 복사 생성자.

구조체가 있고 멤버가 공개되어 있으므로이 클래스 외부에서 펑터 개체를 사용하여 구현하는 것이 좋습니다.

struct MaxWinPerElementInfoPayTablePredicate 
{ 
    MaxWinPerElementInfoPayTablePredicate(const std::string& _paytableName) : 
     paytableName(_paytableName) {} 

    bool operator() (const MaxWinPerElementInfo &elementInfo) const 
    { 
     return paytableName == elementInfo.paytableName; 
    } 

    std::string paytableName; 
} 

다음과 같이 호출 :

std::find_if(elementInfo.begin(), elementInfo.end(), 
    MaxWinPerElementInfoPayTablePredicate(paytable)); 
2

당신은 문자열을 받아 paytableName에 넣습니다 생성자를 추가해야합니다. 그렇지 않으면 find_if() 호출 내에서하려고하는 것처럼 문자열에서 MaxWinPerElementInfo를 만들 수 없습니다.

3

클래스에 std :: string 유형의 인수를 허용하는 변환 생성자가 없습니다. 따라서 컴파일러에서 오류 구문 분석을 실행합니다.

MaxWinPerElementInfo(paytable) 

기능 개체 대신 람다 식을 사용할 수 있습니다. 예를 들어

std::find_if(elementInfo.begin(), elementInfo.end(), 
       [&] (const MaxWinPerElementInfo &elementInfo ) 
       { 
       return paytableName == elementInfo.paytableName; 
       }); 

람다 식을 사용하지 않는 경우 구조체 내부에 기능 개체를 정의 할 수 있습니다. 예를 들어

struct MaxWinPerElementInfo 
{ 
    std::string paytableName; 
    std::string elementName; 
    long long elementCredits; 
    bool  multiplierRequired; 

    struct FindByPaytableName 
    { 
     FindByPaytableName(const std::string &paytableName) : paytableName(paytableName) {} 
     std::string paytableName; 
     bool operator() (const MaxWinPerElementInfo &elementInfo) const 
     { 
      return paytableName == elementInfo.paytableName; 
     } 
    }; 
}; 


std::find_if(elementInfo.begin(), elementInfo.end(), 
       MaxWinPerElementInfo::FindByPaytableName(paytableName)); 

내부 구조를 사용하면 외부 구조의 다양한 데이터 멤버를 사용하여 검색을위한 여러 기준을 정의 할 수 있습니다.

+0

@Eric Fortin 고마워요. 내 게시물을 업데이트했습니다. –