문제

현재 코드의 한 지점에서 운영자에 대한 정보를 보유하고있는 structs를 정렬 해야하는 구문 분석기 클래스를 개발하고 있습니다. 각 연산자는 우선 순위가 있으며, 이는 분석기 클래스의 공개 멤버 기능을 통해 사용자 정의입니다. 따라서 정렬 할 때 해당 연산자의 우선 순위에 따라 요소를 주문하려면 정렬 기능이 필요합니다. 요소를 비교하기 위해 다음 코드를 사용하고 있습니다.

bool parser::op_comp(const op_info& o1, const op_info& o2) {
    op_def& op1 = operators[o1.op_char];
    op_def& op2 = operators[o2.op_char];

    return op1.priority > op2.priority;
}

이 기능은 클래스 내부에 정의되어 있기 때문에이 기능을 정적으로 만들어야했습니다.

사실, 내 비교 함수는 유형의 요소를 비교합니다. op_char, 그리고 나는 유형의 요소가 포함 된지도에서 연산자 def를 검색합니다. op_def, "우선 순위"필드가 있습니다.

내가 직면하고있는 문제는 내가 사용할 수 없다는 것입니다. std::sort(ops.begin(), ops.end(), std::mem_fun_ref(&parser::op_comp)) (여기서 OPS는 a vector of op_info) 방법. 다음 오류가 발생합니다.이 오류는 매우 논리적으로 들립니다.

오류 : 정적 멤버 함수에서 멤버`parser :: 연산자 '의 잘못된 사용

내 질문은 다음과 같습니다. 어떻게 std :: 정렬을 사용하여 클래스의 비 정적 구성원의 요소를 사용하는 comp 함수를 사용하도록 강요 할 수 있습니까? 분명히 함수는 정적이 아니어야하지만 정적으로 만들지 않으면 사용할 수 없습니다 ...

도움을 주셔서 감사합니다, CFP.

도움이 되었습니까?

해결책

함수 대신 functor를 사용하십시오.

struct op_comp : std::binary_function<op_info, op_info, bool>
    {
    op_comp(parser * p) : _parser(p) {}
    bool operator() (const op_info& o1, const op_info& o2) {
        return _parser->op_comp(o1, o2);
    }
    parser * _parser;
};

이런 식으로 방법 op_comp 비 정적 상태를 유지할 수 있습니다. 그러나 발신자는 모든 연산자가 저장되는 파서의 인스턴스가 필요합니다. 이것은 새로운 기능의 사용입니다.

std::sort(ops.begin(), ops.end(), op_comp(&my_parser));

어디에 my_parser 사용중인 파서의 인스턴스입니다. 또는 전화하는 경우 std::sort 파서에서 간단히 쓸 수 있습니다.

std::sort(ops.begin(), ops.end(), op_comp(this));

다른 팁

연산자도 정적으로 만들면 op_comp에서 사용할 수 있습니다.

또는 함수 대신 functor를 사용하십시오.

class myCompareClass {
  public:
  bool operator() (
    const op_info& o1, const op_info& o2) { 
    op_def& op1 = operators[o1.op_char]; 
    op_def& op2 = operators[o2.op_char]; 

    return op1.priority > op2.priority; 
  }
  private:
    ... operators ...
} myCompareObject;

std::sort(ops.begin(), ops.end(), myCompareObject) 

더 많은 예를보십시오 cplusplus.com

op_comp가 비 정적이되기를 원한다면 boost.lambda 또는 boost.bind를 사용할 수 있습니다.

parser my_parser;
sort(ops.begin(), ops.end(), bind(&parser::op_comp, ref(my_parser)));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top