mql5语言的特点、微妙之处以及技巧 - 页 124

 
与本主题无关的评论已被移至"OOP,模板,mql5中的宏, 交易的技巧和诀窍"。
 

我不知道它是否被贴在这里,但它可能对某人有用。当你想重载一个参数化类的方法时,只需要看它是通过值还是通过引用接受相同类型的参数(结构只通过引用,简单类型最常通过值)。可以这样做(第二种方式正好适用于没有&的变体,否则基本结构类型将无法编译)。

template<typename T>
class A
 {
public:
  A* operator<<(T&p){ Print("<< &",typename(T)); return &this; }
  template<typename F>
  A* operator<<(F p){ Print("<< ",typename(F)); return &this; }
 };

void OnStart()
 {
    double ask=Ask,bid=Bid;
    MqlTick mt;
    A<double> a1;
    a1<<Ask<<Bid<<ask;
    A<MqlTick> a2;
    a2<<mt; 
 }

在这里 讨论。

 
Ilya Malev:

我不记得是否在这里,但它可能对某人有用。当你想只通过值或只通过引用来重载一个参数化类的方法时(结构只通过引用,简单类型最常通过值)。这可以这样做(此外,第二个模板正好适用于没有&的变体,否则基本的结构类型将无法编译)。

然后发现,一个为结构类型设计的类可以接受各种数字类型。又该如何处理它们呢?

 
Alexey Navoykov:

然后发现,一个为结构类型设计的类可以接受各种数字类型。又该如何处理它们呢?

在这种情况下,该类旨在用于混合类型--用于结构和简单类型,否则这种结构就没有意义。为了避免在F中采取不必要的类型,你可以在那里对tyename(F)、sizeof(F)等写一个检查。

 
Ilya Malev:

在这种情况下,类是用于混合类型的--既用于结构,也用于简单类型,否则这种结构就没有意义。为了不接受F中不必要的类型,你可以在那里写一个对tyename(F)、sizeof(F)等的检查。

Typename不会保护接受不必要的类型)为此,你需要用适当的类型做一个重载的私有方法。

而且,如果类是为任何类型准备的,为什么要用模板参数将其参数化,造成混乱?虽然有更简单的拐杖变体,没有模板类。

 
Alexey Navoykov:

如果一个类打算是任何类型的,为什么要用模板参数对其进行参数化,造成混乱?

那么,你如何在不提交参数化的情况下采取正确的类型,可以是任何类型?你不能在没有指定类型的情况下声明一个参数或字段。例如,它可以是一个任意数据类型 上的 "包装 "类。

阿列克谢-纳沃伊科夫

typename并不能防止接受不必要的类型 )

如果你写tyename(F)==typename(T),它就会保护。

 
Ilya Malev:

那么,你将如何接受正确的类型,它可以是任何东西,而不传递参数化?你不能在没有指定类型的情况下声明一个参数或字段。例如,它可以是一个任意数据类型 的 "包装 "类。

好吧,那么它只是A类。如果一个模式的参数与该类的行为没有任何关系,为什么要声明这个模式呢?

Ilya Malev:

如果你写tyename(F)==typename(T),它将保护它。

这真的是一件很残酷的事情。你将不得不把类型名控制带到运行时阶段。你的代码将不得不调试多年

 
你能告诉我在哪里可以查到一个普通的追踪止损,只需5美元?
 
Nikita Chernyshov:
你能告诉我在哪里可以查到一个普通的追踪止损,只需5美元?

iSAR iOsMA EA-追踪

 
Vladimir Karputov:

iSAR iOsMA EA-追踪

谢谢你!