「U ++の利点は、その異常性と高い「参入障壁」を上回っていますか?」 私の意見では、はい。 U ++は、特にデータベースの大量使用が予想される場合、ゼロから開発されたクロスプラットフォームプロジェクトに最適です。
カットの下には、データベースに保存されているドキュメントの編集されたディレクトリの毎日の作業の月のフォーラムおよびマニュアルで発見したU ++のニュアンスがあります。 私はすぐに 「素晴らしき三位一体」との比較がないことに気付くでしょう。最も単純なGUIで以前はWTLを使用し、残念ながらeGUI ++ライブラリを探しましたが、残念ながら作者は見捨てましたが、誰もいませんでした。
まず第一に、Ultimate ++は最後通告です:TheIDEの独自の環境、または、たとえばVisual Studio + STL + POCO + WTLのようなWindowsでのセット。 その結果、例外を忘れる必要がありますが、残りはまともですが、私が書いた非同期クライアント/サーバーファイル転送コードの断片で示されています。
コア
- デリゲート(GUIでイベントをバインドするためのメインツール。個人的には、私が最も夢中になりました)
//: // , 4 void Func() {}; void Func4(int, double, String, Value) {} // GUI_APP_MAIN { Callback cb = callback(Func); cb(); //stateful Callback cb4 = callback4(Func4, 1, 2, AsString(3), 4); cb4(); //stateless Callback4<int double string value> cb1 = callback(Func4); cb1(1, 2, AsString(3), 4); } // class AppMain { public: // THISBACK typedef AppMain CLASSNAME; Callback cb; Callback cb4; AppMain() { cb = THISBACK(Func); cb4 = THISBACK4(Func4, 1, 2, AsString(3), 4); } void Func() {}; void Func4(int, double, String, Value) {} }; // GUI_APP_MAIN { AppMain m; m.cb = callback(&m, &AppMain::Func); m.cb4 = callback4(&m, &AppMain::Func4, 1, 2, AsString(3), 4); } </int>
- シングルトン
// SomeClass - Single<someclass>().SomeMethod();
- ロギング(実数では、%lfの代わりに%fが使用されることに注意してください)
// StdLogSetup(LOG_COUT|LOG_FILE); ... LOG(Format("Total %d files have sended\n", n)); LOG("Total " << n << " files have sended");
- Iniファイル
VectorMap<string string> config = LoadIniFile(GetExeDirFile("config.ini")); String host = config.Get("HOST"); int port = ScanInt(config.Get("PORT")); for (int i = 0; i < config.GetCount(); i++) { if ("FILE" == config.GetKey(i)) { Cout() << config[i] << "\n"; } }
- マルチスレッド
// Thread::Start(callback(Func)); //c Thread th; th.Run(callback(Func)); th.Wait(); Thread::ShutdownThreads();
私の知る限り、OpenMPはサポートされていませんが、代わりに、 デリゲートを操作するCoWorkが推奨されていますが、これはループの並列化には不便です。
- テキストJSON(バイナリデータはBase64Encode / Base64Decode関数のペアでサポートされます)
FileIn fp(fname); Json json; json("fname", fname)("fsize", (int)fp.GetSize())("fdata", Base64Encode(LoadFile(fname))); ValueArray jsonAr = ParseJSON(json.ToString()); fname = jsonAr[0]; int fsize = jsonAr[1]; String fdata = Base64Decode(jsonAr[2]);
- ソケット
TcpSocket server; if (!server.Listen(port)) { LOG(Format("Can't open server port %d for listening\n", port)); return; } for(;;) { LOG("Waiting..."); TcpSocket socket; if (socket.Accept(server)) { String msg = ""; for (int c = socket.Get(); c > 0 && c != '\n'; c = socket.Get()) { msg.Cat(c); } } }
- RegExp(PCRE)
RegExp reg("(\\\\)"); String path = "D:\\test.txt"; if (reg.Match(path)) { int last; int first; reg.GetMatchPos(0, first, last); String drive = path.Mid(0, last); String fname = path.Mid(last); }
- 組み込みのメモリリークチェック(mallocは追跡されません)
GUI_APP_MAIN { double *d = new double(0); }
SQL
こことここを見て ください 。 PHP / Yiiファンは感謝するはずです。
QTF(ReportView)
QTFは、高度なテキストフォーマット用のネイティブU ++形式です。 RichEditおよびレポートの生成で使用されます。 TheIDEには実験用の特別なデザイナーがいます:
レポートを印刷するための特別なダイアログも提供されています(pdfでの保存はReportWindowの腸内にあります):
Color rgb_color = Color(109, 171, 211); String qtf_color = Format("@(%d.%d.%d)", rgb_color.GetR(), rgb_color.GetG(), rgb_color.GetB()); String qtf; qtf.Cat(Format("[R9/%s Habrahabr &]", qtf_color)); qtf.Cat(Format("[_%s ] [ ] [_%sq\\&a] [_%s ] [_%s ] [_%s ]", qtf_color, qtf_color, qtf_color, qtf_color, qtf_color)); Report rep; rep << qtf; ReportWindow().Perform(rep);
テキストのスタイルはタグ[and]で囲まれ、最初にブラケットの後ろに[QTF識別子があり、次にスペーステキストのみです。 一般に、原則はHTMLのようなもので、違いは名前だけです。
バザール
Bazarは特定のニーズに対応する一連のユーザーライブラリであり、中でもOfficeオートメーションでのWord / Excelのクロスプラットフォーム作業は非常に役立ちました。
#include <OfficeAutomation/OfficeAutomation.h> GUI_APP_MAIN { //Excel OfficeSheet sheet; bool xlsOn = sheet.IsAvailable("Microsoft"); if (xlsOn) sheet.Init("Microsoft"); //Open Office Calc if (!xlsOn) { xlsOn = sheet.IsAvailable("Open"); if (xlsOn) sheet.Init("Open"); } if (xlsOn) { FileSel fs; fs.Type(" ", "*.xls *.xlsx"); fs.AllFilesType(); if (fs.ExecuteOpen(" Excel ")) { sheet.OpenSheet(~fs, true); sheet.AddSheet(true); } } //Word OfficeDoc doc; // Word2003 Word2007, - Word2003. . bool docOn = doc.IsAvailable("Microsoft"); if (docOn) doc.Init("Microsoft"); //Open Office Writer if (!docOn) { docOn = doc.IsAvailable("Open"); if (docOn) doc.Init("Open"); } if (docOn) { FileSel fs; fs.Type(" Word", "*.doc *.docx *.rtf"); fs.AllFilesType(); if (fs.ExecuteOpen(" Word ")) { doc.OpenDoc(~fs, true); doc.AddDoc(true); } } }
ニュアンス
- ロシア語のファイル選択ダイアログは、Windows自体がRussifiedであっても、サブフォルダーを翻訳しません。
SetLanguage(SetLNGCharset(GetSystemLNG(), CHARSET_UTF8));
- 実際のアプリケーションの例を見ると、メニューにアイコンとテキストを含むスクリーンショットがないことがわかります。これは実行できないためです。テキストを含むアイコンはメニューのサブセクションのみを持つことができ、メインメニューは常にテキストです。
- ボタンには、サイズ変更のためのデフォルトのプロパティはありません。
- Alt + Shift +ステッチ+タブを使用した行の便利なブロックラインシフトはサポートされていません。これは、Visual StudioとNotepad ++の後では面倒です。
- エディターが最後の操作を常に正しくキャンセルするとは限らない最大の問題。 2つの方法で現れます。手動キャンセル(またはCtrl + Z)を使用すると、隣接する行だけでなく、行が混ざり始めることができます(1回または2回キャッチされます)。 F5またはCtrl + F5を使用して起動すると、最後の編集がキャンセルされることがあります(より頻繁に発生します)。
- Intellisenseには問題があります。Intellisenseには、コード内の既存の変数の利用可能な署名が、記述されたものよりも多く表示される可能性があります。 また、リストからオブジェクトのプロシージャを呼び出すときに、コード
obj.f()
がobj.f() ()
変換されない状況を認識したい
まとめ
参加しよう! 私が書いていない多くの点は、積極的な改善が必要です。 小さな分布で32 mbに値します。