打字问题 - 页 2

 
Ilya Malev:

好吧,换句话说,你已经重复了我写的东西。问题不是能不能,而是为什么不能,以及我们如何能优雅地解决这个问题。

只写转换的函数,而不去管方法里面的开关?

double double(CParameter<double>)

string String(CParameter<double>)

并使用:

PrintFormat("%s %s %f",String(param1),String(param2), Double(param1))。

使用单数运算符和命名函数有什么区别? 函数更好--运算符已经有了语义负载,你不想随意改变它。

 
fxsaber:

类型控制丢失。请看C++资源以获得这些问题的答案。我认为他们经常被问到。

好吧,至少很清楚这不是mql的限制,而是一般C++的特性,为此感谢你:)

 
在不把重载运算符的lparam与特定对象或结构相联系的情况下,无法重载运算符也是C++的一个特点吗?
 
Ilya Malev:

有了显式重载和算术动作,一切都很清楚了。是的,在这种情况下,重载=显然更好,你是对的,我只是为一个问题匆忙地建立了一个例子,并没有真正考虑到这一点(虽然那里的数字不仅是int,还有char、ucar、short、ushort、uint、bool和color,所以不是所有东西都是明确的 )))))))


这里的问题是,重载方法 的返回值的类型取决于对象的内容。

例如,我们有一个多类型的数组(我就不举例了,因为有很多书)。当然,任何数组都必须有[]的索引操作,它可以返回具有适当索引的变量的值。

但变量有不同的类型。这个索引下可能有数据时间或字符串或其他用户定义的类型。而且最理想的是,我希望在索引[]时,返回值类型能自动产生适当的类型,而不需要明确地将其参数化。我曾经这样解决这个 "问题":var[(char)1]、var[(short)1]、var[(uint)1],等等,但这些拐杖是没有用的。

使用像mqlparam 这样的结构数组。

 
Dmitry Fedoseev:

一个类似于mqlparam 的结构数组。

它不能以同样的方式等同于双倍、字符串或长。

MqlParam par;

par.double_value = Ask;

double d = par; // '=' - 非法操作使用

 
Ilya Malev:

你不能以同样的方式把它等同于一个双数、字符串或长数。

MqlParam par;

par.double_value = Ask;

double d = par; // '=' - 非法操作使用

你看到它是什么类型,并把它分配到适当的领域。这似乎是一种歪门邪道,你还在寻找一个完美的解决方案。这样的任务根本就不应该出现。

 
Ilya Malev:
如果不把重载运算符与特定的对象或结构联系起来,就不可能重载运算符,这也是C++的一个特点吗?

这是互联网上关于此事的说法。

如果函数只在返回值的类型上有差异,那么函数的重载是不可能的。

C++14标准13.1/2。

 

我在网上找到了这个关于一个类似问题的答案。

template<typename T> T f();
template<> int f() { return 2; }
template<> double f() { return 2.7; }

//...
struct F {
    F() {}
    template<typename T> operator T() { return f<T>(); }
};

int x2 = F();
double y2 = F();


根据我的理解,这里的运算符被重载为 "运算符T() "类型--这意味着在C++中至少是可能的。但在mql中,据我所知,还没有。

 
Ilya Malev:
一个类似的问题:为什么当重载一个方法时(在重载的方法 签名中)不显示返回类型,而只显示参数类型,也就是说,你不能用不同的返回值类型定义两个相同的方法,为什么会有这样的限制?

这可能就是原因。

int f() {
   call_something();
   return 0;
}

double f() {
   call_something_other();
   return 0;
}

void start() {
   f();
}

究竟应该调用哪个函数?

 
pavlick_:

这可能就是原因。

究竟应该调用哪个函数?

模板不匹配的错误可能应该在编译时发生。


但是在有一个数组对象的情况下

class Array{

public:

Array *operator[] (int i){ id = i; return GetPointer( this ); }

double operator[]( int i){ id = i; return data[i]; }

Array *operator=(double d){ data[id]=d; return GetPointer( this ); }

private:

double data[10];

int id;

};



int OnStart(){

  Array array;

  double d=123.456;

  array[5]=d;

  d=array[5];

}

这样的错误不应该发生,因为在第一种情况下,Array[int]操作的调用被用作左参数=,并且不是双变量,但在第二种情况下,它是右参数,并且左参数是 变量类型

所以,总的来说,我们希望在mql中引入重载类型操作的可能性(包括隐式),即为方法调用定义上下文,并根据该上下文中预期的返回值的类型,调用所需的代码。而如果没有明确定义上下文,就会产生一个错误。