我有两个较长的代码块,它们是相同的,除了在各种比较语句中用、with等>
切换。我想把它们放在一个函数中,并根据函数输入使用一个或另一个运算符。<
>=
<=
我正在使用MQL5进行编码,但这与 C++ 非常相似,因此希望在此工作的方法也可以在我的情况下使用。
我有两个较长的代码块,它们是相同的,除了在各种比较语句中用、with等>
切换。我想把它们放在一个函数中,并根据函数输入使用一个或另一个运算符。<
>=
<=
我正在使用MQL5进行编码,但这与 C++ 非常相似,因此希望在此工作的方法也可以在我的情况下使用。
您可以为所需的每个比较创建一个比较器函数,然后将正确的函数作为参数传递给较长的代码块(包装在适当定义的函数中)
例如,考虑以下假设情况,其中函数 ( myFunc
) 接收 2 个整数 (a
和b
) 并处理它们。除了对参数进行的比较类型之外,处理步骤是相似的。我们通过提供正确的比较工具来解决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;
}
显然,comp1
是comp2
2 个不同的比较器。myFunc
我们根据要求(<
或>
)传递其中一个。
最好的事情是,您的比较现在可以随心所欲地复杂,并且myFunc
忽略了复杂性。
在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");
}
它不优雅,但很有效。
将“比较器”作为函数或仿函数传入,在这种情况下,我使用的是标题中定义的std::less
和std::greater
仿函数functional
,或多或少为所有运算符定义了仿函数。
#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