打字问题 - 页 4

 
Ilya Malev:

现在还不是很清楚问题出在哪里。难道对象的初始化不能放在一个单独的方法中,如Init(),甚至可能是一个虚拟的方法?

是的,当然了。不能让class.get_int()/class.get_double()/class.get_string()/...?)).风格、习惯...

 
pavlick_:

当然,你可以。无法实现class.get_int()/class.get_double()/class.get_string()/。?)).风格、习惯...

我们可以,但让我们写d=var[x].get_double,而不是d=var[x],只要有double的地方,var[];。如果我们要搞受虐狂,我们应该集体进行=))。

 
Ilya Malev:

因此,最终它归结为希望在mql中引入重载类型操作(包括隐式)的能力,即定义一个方法调用上下文,并根据该上下文中预期的返回值类型来调用所需代码。

这显然不是C++的标准,一般来说,C++的好处(它被MQL的开发者当作基础)是,在C++中,凡是程序员不能明确处理的事情,他都必须与指针打交道,并编写他的类型定义 类型

指针只是一个指向内存地址的指针,你总是可以把它作为一个参数传递,并作为一个函数的结果得到它,解除指针给你一个内存字节的物理值,把指针转换成它的新类型给你很多字节的内存 ))))

在MQL中,指针很难说出原因,但它们就在那里,开发者说优先考虑的是数据保护,所以所有可能导致沙盒退出的创新都被排除在外。



关于这个问题,不幸的是,我没有什么使用模板(template)工作的实践,但我怀疑你可以这样做。

1.编写一些重载函数,将所需类型作为结果返回,并将该类型作为参数,即像这样。

//+------------------------------------------------------------------+
int f(const int x)
  {
   return((int)1);
  };
//+------------------------------------------------------------------+
double f(const double x)
  {
   return((double)2);
  }
//+------------------------------------------------------------------+
string f(const string x)
  {
   return((string)3);
  }
//+------------------------------------------------------------------+
void OnStart()
  { 
   int    a=0;
   double b=0;
   string c="0";
   a = f(a);
   b = f(b);
   c = f(c);
   Print("a = ",a);
   Print("b = ",b);
   Print("c = ",c);
}

2.现在f()函数需要被包裹在一个模板中,并隐藏参数x - 如果模板允许你这样做,那么调用将是a=f() - 在视觉上一切都会很好,就像输入

 
Igor Makanu:

这显然不是一个C++标准

我认为你错了--虽然我已经很久没有用 "纯 "C++写东西了,但网上有很多这样的代码例子

class A
{
public:
    operator int()const;
};

A::operator int()const
{
    return 0;
}
 
Ilya Malev:

我认为你错了--虽然我已经很久没有用 "纯 "C++写作了,但网上有很多这样的代码例子

但如果是复杂的类型 呢?- 在C++中,这个问题是通过使用指向其类型的指针来解决的,物理编译器返回内存地址,解除指针确保数据被正确处理。

 
Igor Makanu:

这个例子可以正确地工作,但如果是一个复杂的类型 呢?- 在C++中,这是用指向其类型的指针来解决的,物理编译器返回内存地址,而指针的解除引用提供了对数据的正确处理。

不幸的是,这样的例子在mql中无法正确工作。

一个复杂的类型、结构或数组可以重载任何你需要的东西,它不需要类型转换重载...

 
Ilya Malev:

不幸的是,在mql中,这样的例子不能正确工作。

嗯,是的,我刚刚看到,你想重载类型转换,MQL的帮助明确说允许重载,而单数操作只能分别重载为单数和二数,我在处理矩阵时,试图重载^--它不起作用,我不得不使用!

  • бинарные +,-,/,*,%,<<,>>,==,!=,<,>,<=,>=,=,+=,-=,/=,*=,%=,&=,|=,^=,<<=,>>=,&&,||,&,|,^;
  • 单数的+,-,++,--,~。
  • 赋值运算符=。
  • 索引运算符[]。


我又看了看我的例子--编译器不允许把我的例子包在模板。 我可以返回((1/x) --我可以给一个字符串作为参数x。通常所有的C编译器在编译时都会检查类型匹配,而MQL不允许把不明确的解决方案包在模板里。

我认为,在MQL中,只有通过描述所有的重载函数,才能正确地解决你的问题--主题的第1帖。 然后,所有传递和返回的变量类型以及所有重载函数都将在编译时被检查

 
Igor Makanu:

是的,我刚刚看到,你想重载类型转换,MQL的帮助明确指出,重载是允许的,单数操作只能分别重载为单数和双数,我在处理矩阵时,试图重载^ - 它不工作,我不得不使用!

我可以99%地指出,不存在^不能过载的这种情况,而!而重载能力并不取决于运算符的类型。你一定是误解了什么。就把这个例子贴在这里,如果你已经忘记了,忘记了,还是不要了吧)。

我遇到的关于运算符类型的唯一限制是禁止重载逻辑运算符==, !=, !和=应用于指针(any_type * )。正确地重载它们需要使用自对象或结构。就在最近几个月,我在这些东西上吃了很多狗肉,所以我可以自信地说:)

 
Ilya Malev:

我可以说99%的情况是,没有任何情况下^不会过载,但!会。而超载的能力并不取决于操作者的类型。你一定是误解了什么。就把这个例子贴在这里,如果你已经忘记了,忘记了,还是不要了吧)。

我遇到的关于运算符类型的唯一限制是禁止重载逻辑运算符==, !=, !和=应用于指针(any_type * )。正确地重载它们需要使用自对象或结构。最近几个月,我吃了很多这样的窍门,所以我可以自信地说:)

#include <Math\Alglib\linalg.mqh>
class Matrix
  {
public:
   CMatrixDouble     M;
   int               row;//m_strok;
   int               col;//n_stolb;
   void              Matrix(void)         {                             }
   void              Matrix(int m,int n)  { M.Resize(m,n); row=m;col=n; }
   //----      умножение матриц
   Matrix operator*(const Matrix &B){Matrix res(this.row,B.col);CAblas::RMatrixGemm(this.row,B.col,this.col,1.0,this.M,0,0,0,B.M,0,0,0,0,res.M,0,0);return(res);  }
   //----      транспонирование матрицы
   Matrix operator!(void){Matrix res(this.col,this.row);CAblas::RMatrixTranspose(this.row,this.col,this.M,0,0,res.M,0,0);return(res);                             }
   //----      нулевая матрица
   void              zeros(int r,int c) {this.M.Resize(r,c);this.row=r;this.col=c;for(int i=0;i<r;i++){for(int j=0;j<c;j++){this.M[i].Set(j,0.0);}}               }
   //----      вывод в журнал матрицы
   void MatrixPrint(string  separator="|",uint digits=3){string s,sep=" "+separator+" ";for(int i=0;i<row;i++){s=separator;for(int j=0;j<col;j++) s+=DoubleToString(M[i][j],digits)+sep;Print(s);Sleep(123);}}
private:
   void              Matrix(const Matrix &R) { this=R;                                                                                                            }
  };

在 "经典 "的矩阵处理中,你需要使用^运算符来转置矩阵,这是我的例子--我从Matlab中移植了SSA方法,它是基于CMatrixDouble的最简单的乘法、赋值和转置矩阵--它...它不知道它所存储的矩阵的大小(它有多少行和多少列)。

 
P.S., 啊,也就是说,你想把一个二进制运算符重载为一个单进制运算符(2ar为1ar),那么是的,当然不会了。唯一的例外是[] 。