nstd-C ++ライブラリ-有用なクラスの「紳士用セット」







私は常に、他のライブラリやフレームワークと簡単に組み合わせて、他のプロジェクトに簡単に転送できる、依存性の少ない特定の「紳士用」ライブラリクラスを手元に用意したかったのです。 sayingにあるように-電源を入れ忘れました。 そして最も重要なこと-「使用していないものにお金を払わない」(C)C ++











nstd ::



ヘッダーファイルのみで構成されるライブラリが好きです。 さらに、モジュールはC ++で提供されています! :) nstdライブラリはすぐに予約を行います。nstdライブラリは、boost、Qt、POCOなどの優れた強力なライブラリとフレームワークの場所であると主張するものではありません など むしろ、それらを補完するものです。



私のライブラリーはC ++ 17の機能を使用しており、機能的に弱く相互に依存するいくつかのクラスで構成されています。 ライブラリが積極的に補完および変更されていることをすぐに警告します。おそらく、この記事を読んだ時点で既に変更されているため、最新の情報についてはこちらのソースコードを参照することをお勧めします。



ライブラリには、クラスの使用に関するいくつかの例が含まれています。 彼らのために、CodeBlocksプロジェクト(Windows用)を含めました。 ただし、この例には、他のタイプのプロジェクトを生成するためのGENie構成ファイルも含まれています。 たとえば、これらの目的のためにMakefileを簡単に生成できます。 C ++ 17は、GCC 7.1およびClangの最新バージョンでサポートされています。 残念ながら、Visual Studio 2017は新しい標準のすべての機能をまだサポートしていません。特に、データメンバーのインラインおよびネストされた名前空間を宣言する簡単な方法はサポートされていません。 したがって、原則として、GENieを使用してVS 2017のプロジェクトを生成できますが、まだコンパイルされていません。 本当に必要な場合は、VS 2017でコンパイルするソースを自分で修正できますが、難しいことではありません。



CodeBlocksがない場合、またはインストールしたくない場合は、MinGW-w64 GCC 7.1 for Windowsの例を使用して、GENieおよびMakefilesを使用して例をすばやく生成およびコンパイルする方法を説明します。



  1. GCC 7.1でMinGW-w64をダウンロードします 。たとえば、こちらから 。 便利なフォルダーに解凍し、MinGW / binフォルダーへのパスをPATH変数に書き込みます。
  2. ここから実行可能ファイルGENie for Windows(他のOS用もあります)をダウンロードします
  3. genie.exeをgenie.luaファイルがあるフォルダーにコピーします。
  4. Makefileを生成するには、examplesフォルダーからコマンドを実行します:“ genie.exe gmake”
  5. サンプルのあるフォルダーには、各プロジェクトのメインMakefileとサブMakefileが表示されます。
  6. たとえば、リリース構成のすべての例を収集するには、同じ場所で「mingw32-make.exe config = release」を実行します。 サンプルの1つのみを収集する場合は、サンプルの名前を追加するだけです。たとえば、「mingw32-make.exe config = release relinx_example」です。


nstdライブラリはMITライセンスの下で配布されており、開発のクラスだけでなく、サードパーティの開発も含まれています。 Githubのプロジェクトの説明では、プロジェクトに含めたサードパーティクラスを示しています。 リポジトリでは、それらは別の外部フォルダーにあります。



nstdの現在のコンテンツについて簡単に説明します。



ここでHabrahabrのRelinxクラスをすでに発表しまし 。 簡単に言えば、これはLINQ for C ++です。 レイジーコンピューティングがサポートされ、ほとんどすべての.NET LINQメソッドが実装されています。 nstdでRelinxを有効にすることにしました。 善は失われません:)。



signal_slotクラスは、信号とスロット間の接続が切断されたときに信号とスロットが自動的に相互に切断できるという点で便利です。 任意のタイプの信号との各スロット接続は、接続クラスによって表されます。接続クラスが破壊されると、信号スロットバンドルが壊れます。 重要なことは、信号やスロットとは異なり、接続はテンプレートではないことです。これにより、信号やスロットの種類に関係なく、コンテナに接続を保存できます。 したがって、このコンテナが破壊されると、信号とのすべての通信が切断されます。 これは、このコンテナを含むオブジェクトが破棄され、シグナルから特に切断する必要がない場合に便利です-これは自動的に行われます。



live_propertyは 、signal_slotクラスに基づいて構築されます。 これはタイプのバインドであり、タイプの変更を追跡でき、必要に応じて、値を変更するかどうかの動作を制御できます。



expiry_cacheは、特定の時間だけデータを保存し、データの有効期限についてシグナルで通知するテンプレートコンテナーです。 それは2つのモードで動作します:データが保存時間中にアクセスされた場合、データの寿命を延ばします。データの寿命を延ばさないモードです。 また、別のストリームを介したバックグラウンドでの自動クリーニングモードがあります(自動バキューム)。



jsonは、JSONデータ形式を操作するためのサードパーティライブラリです。



asioは、ネットワーク接続を操作するためのサードパーティライブラリです。 おそらく、まもなくC ++標準に入るでしょう。



urdlはasio作成者によるサードパーティライブラリですが、他の開発者によって分岐および開発されています。 ネットワークからデータを便利にダウンロードできます。



sqliteは、sqlite3のサードパーティラッパーです。 非常に興味深い実装。



量子乱数プロバイダーは、無料のQRNGサービス(http://qrng.anu.edu.au)を使用する乱数ジェネレータークラスで、量子機器で生成された乱数を返します。



これらのクラス(およびここで言及していない他のクラス)の使用例については、こちらのGithubリポジトリをご覧ください 。 ご質問やご提案がございましたら、お問い合わせください!



私は積極的にnstdライブラリを有用なクラスで補完しようとしています。 nstdライブラリの開発に参加することを皆に勧めます。 有用なクラスがあれば、私に送ってください。 適応してライブラリに含めようとします。



/// TODO:


近い将来、TCPまたはUDP接続を介して機能するリモート信号を実装したいと考えています。 プロセス間の通信とネットワーク経由の通信にこれらの信号を使用します。



Blend2DまたはAGGに基づいて、シグナルスロットの実装を使用してGUIクラスを実装するというアイデアはまだあります。 どのグラフィックライブラリをベースにするかはまだ決めていません。 この件に関するご意見をお聞かせください。



All Articles