文章 "使用伪模板替代 C++ 模板"

 

新文章 使用伪模板替代 C++ 模板已发布:

本文说明了一种不使用模板但保持它们固有的编程风格的编程方式。文章讨论使用自定义方法实施模板的问题,并且附带了一个现成的脚本以依据指定的模板创建代码。

Start window of the script

作者:Nikolay Demko

 

我喜欢这篇文章,虽然我什么也没看懂。

"这就是为什么模板解决的主要任务仍然是减少程序员从键盘上输入的代码量"

既然可以不用复制粘贴,为什么还要用模板呢?而且输入的代码量根本不会影响你的工作--好吧,会有 300 行代码而不是 100 行--那又有什么问题呢?最重要的是,它能正常工作,调试也不会过度紧张。

没有模板,代码将更加透明。

[删除]  
Virty:

我喜欢这篇文章,虽然我什么也没看懂。

"这就是为什么模板解决的主要任务仍然是减少程序员从键盘上输入的代码量"

既然可以不用复制粘贴,为什么还要用模板呢?而且输入的代码量根本不会影响你的工作--好吧,会有 300 行代码而不是 100 行--那又有什么问题呢?最重要的是,它能正常工作,调试也不会过度紧张。

没有模板,代码将更加透明。

300 :)

1-2万行(考虑到分模块)......??

 
Interesting:

300 :)

10-20K 你觉得如何(考虑到模块的细分)....??

真的是 2 万吗?我的天,你是怎么挖到这里来的?也许算法还没有最终确定?这样的大小早就应该放到库里了。你是怎么编程的?2 万行就是 10 个程序员 6 个月的工作量。
[删除]  
Virty:
是 2 万吗?天哪,你是怎么挖进去的?也许算法还没最终确定?这种大小早就应该放在图书馆里了。你在编什么程序?2 万行,10 个程序员六个月的工作量。

至于库,我告诉过你--要考虑模块化。

至于 2 万行,我们见过更多。例如,1C 7.7 的 modzli 就有 5 万行(这不是他们自己的代码,而是别人的代码)。

[删除]  
尼古拉,好文章。我一定会尝试一下,也许我会喜欢并在 MQL5 中使用 "模板"。
 

请原谅我没有理解任务的实质。在 C++ 中可以保存源代码记录,而在这里则不行。C++ 中的函数模板显示了真正可以省钱的地方。"节省源代码 "是关键所在。

而生成明显过量的源代码会给以后的工作带来困难,那么,请不要这样做。

不同的数据类型需要相同的函数吗?MQL5 有方法重载功能。我毫不怀疑您知道这一点。特别是因为改变输入数据类型往往需要改变实现。

还有这个:

>>当然,为了调试,您必须将文件移动到被调用文件的目录或包含目录。这正是我在上文提到伪模板的缺点时所说的调试不便之处。

你不需要手动移动任何东西。

#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+
void gena() 
  {
   string filename="code.mqh";
   int handle=FileOpen(filename,FILE_WRITE|FILE_UNICODE);
//-- 任意代码生成
   string st=TimeToString(TimeLocal(),TIME_DATE|TIME_MINUTES|TIME_SECONDS);
   string code="MessageBox(\"Hello World!现在: "+st+"\");\r\n";
//------------------------------
   FileWriteString(handle,code);
   FileClose(handle);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   gena();
   #include "../Files/code.mqh"; //包含生成的代码
//---
   return(0);
  }

这个例子很原始。Inkludes 可以插入函数内部。被包含文件中的所有代码都在插入位置的可见范围内运行。唯一的问题是,你必须在 Files 中创建一个空的 code.mqh 文件,以防止编译器骂人。第一次运行时将创建代码,第二次运行时将包含生成的代码。

 

尼古拉,我有个问题。您有一个可以评估字符串的函数吗?例如

str="double a=1.5;"

void eval(str);
Print(a); // a=1.5

我需要一个void eval(str) 函数,结果是 a=1.5。

文章很好,谢谢!

 
denkir:

尼古拉,我有个问题。您有一个可以评估字符串的函数吗?例如

我需要一个void eval(str) 函数,结果是 a=1.5。

文章很好,谢谢!

我知道问题不是关于求值,而是关于解析。解析的用途非常广泛。

你可以编写不同的规则。这完全取决于你想要得到什么。

例如:在这样的例子中,解析器应该如何表现?

"double a=1.5;"
"double a =1.5;"
"double a = 1.5;"
"double a=1.5,b=2.5;"
"double a =1.5,b =2.5;"
"double a = 1.5,b = 2.5;"
"double a = 1.5 , b = 2.5 ;"
你知道的。我只能建议您通过简单的示例来研究字符串函数部分的功能。如果您能从内存中操作函数,您就能根据功能的可能性来规划您的开发。而不用考虑什么能做,什么不能做。了解了功能的可能性,您就能清楚地知道哪种算法最适合解决您的任务。
 
Urain:

因此,我认为问题不在于评估,而在于解析。解析是非常灵活的。

你可以有不同的规则。这完全取决于你想要得到什么。

例如:在这样的例子中,解析器应该如何表现。

你知道的。我只能建议您通过简单的示例来学习字符串函数部分的功能。如果您能从内存中操作函数,您就能根据功能的可能性来规划开发。无需考虑能做什么,不能做什么。了解了功能的能力,您就能清楚地知道哪种算法最适合解决您的任务。
非常感谢你的回答...我会研究这个问题的
 
denkir:
非常感谢你的答复我会研究这个问题的
顺便说一下,逻辑运算< > > == 是为字符串 定义的。
Документация по MQL5: Основы языка / Операции и выражения / Логические операции
Документация по MQL5: Основы языка / Операции и выражения / Логические операции
  • www.mql5.com
Основы языка / Операции и выражения / Логические операции - Документация по MQL5