비교 함수 내에서 비 정적 클래스 멤버를 사용합니다
문제
현재 코드의 한 지점에서 운영자에 대한 정보를 보유하고있는 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)));