2014-04-26 5 views
2

다양한 비교 문을 제외하고는 두 개의 길쭉한 코드 블록이 있습니다. ><, >=, <= 등으로 전환되었습니다.이 코드를 함수에 넣고 함수 입력에 따라 하나의 연산자 또는 다른 연산자를 사용하고 싶습니다.< or > (또는 다른 비교 연산자)을 함수 입력에 따라 표현식에서 어떻게 사용할 수 있습니까?

나는 MQL5으로 코딩하고 있지만 이것은 C++과 매우 유사하므로 잘 작동하는이 방법이 제 경우에도 유용 할 것입니다.

당신은 당신이 필요로하는 각각의 비교를위한 비교 함수를 만든 다음 예를 들어 (적절하게 정의 함수에 싸여)을 기름 한 코드 블록에 인수

으로 올바른 기능을 전달할 수

답변

3

이의 생각 함수 (myFunc)가 2 개의 정수 (ab) 을 수신하고 처리하는 가상의 경우를 가정합니다. 처리 단계는 인수에 대해 수행 된 비교 유형을 제외하고는 유사합니다. 우리는 myFunc오른쪽 도구을 제공하여 문제를 해결합니다.

#include <iostream> 
using namespace std; 

bool comp1(int a, int b) { 
    return a > b; 
} 

bool comp2(int a, int b) { 
    return a < b; 
} 

void myFunc(int a, int b, bool (*myComp)(int, int)) { 
    bool res = myComp(a, b); 
    cout << "value : " << res << endl; 
} 
int main() 
{ 
    myFunc(1, 2, comp1); //use > 
    myFunc(1, 2, comp2); //use < 
    return 0; 
} 

은 분명히 comp1comp2는 2 개 개의 다른 비교기이다. 요구 사항 ( < 또는 >)에 따라이 중 하나를 myFunc으로 전달합니다.

가장 좋은 점은 비교가 원하는만큼 복잡 할 수 있으며, myFunc은 복잡함을 인식하지 못한다는 것입니다. 나는 functional 헤더에 정의 된 std::lessstd::greater 펑터를 사용하고 있는데이 경우에 함수 나 펑터로 "비교"에

+0

감사합니다.하지만 불행히도 내 환경에서는 작동하지 않습니다. 다른 방법을 아십니까? – whitebloodcell

+0

@whitebloodcell이 환경에서 "작동하지 않게"하는 제한은 무엇입니까? –

+0

@whitebloodcell'mql5'에 대해서는 전혀 모르겠지만 브레인 스토밍과 '길게 늘어나는 코드 블록'이 실제로 필요한지 확인하는 방법 중 하나 일 것입니다. 어쩌면 연산자 종속적 인 부분이 최소화 된 방식으로 코드를 재구성 할 수 있습니다. – axiom

1

패스, 더 많거나 적은 모든 사업자에 대해 정의 펑이있다.

#include <iostream> 
#include <functional> 

template<typename Comparator> 
void do_something(Comparator comp) 
{ 
    int a = 1; 
    int b = 2; 

    if (comp(a, b)) { 
     std::cout << "expression was true" << std::endl; 
    } else { 
     std::cout << "expression was not true" << std::endl; 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    do_something(std::greater<int>()); 
    do_something(std::less<int>()); 
} 

출력 :

expression was not true 
expression was true 
+0

이것은 유효한 접근법이지만 불행히도 MQL5는 클래스 템플릿/복잡한 템플릿을 지원하지 않습니다 형식적 매개 변수 (즉, 함수/펑터). – manlio

2

MQL4에서 코딩 당신은/템플릿을 작동하지 포인터를 가지고있다. MQL5에는 템플릿이 있지만 형식적 매개 변수 유형은 만 기본 또는 기본 사용자 정의 유형입니다.

당신은 같은 것을 시도해 볼 수도 있습니다 : 그것은 우아한되지 않습니다

enum COMPARATOR 
{ 
    C_EQUAL = 0, 
    C_LESS = 1, 
    C_GREATER = -1 
    C_AT_MOST = 2, 
    C_AT_LEAST = -2, 
}; 

bool cmp(int a, int b, COMPARATOR c) 
{ 
    switch (c) 
    { 
    case C_LESS:  return a < b; 
    case C_AT_MOST: return a <= b; 
    case C_EQUAL: return a == b; 
    case C_AT_LEAST: return a >= b; 
    case C_GREATER: return a > b; 
    } 

    Alert("INTERNAL ERROR: UNKNOWN COMPARISON"); 
    return false; 
} 

void a_function(COMPARATOR c) 
{ 
    if (cmp(MathRand(), 13, c)) 
    Print("BOOM"); 

    // *** If you need the "opposite" of c *** you can write: 
    if (cmp(Time[0], Time[1], COMPARATOR(-c)) 
    Alert("DONE"); 
} 

을하지만 효과적입니다.