問題タブ [template-meta-programming]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
812 参照

c++ - アルゴリズムを制御するためのファンクターのコンパイル時のコンテナー?

次のような単純なものが必要だとします。

特殊なアルゴリズム (コンパイル時に特殊化された) の 1 つをランダムに選択し、このアルゴリズムを処理するコア アルゴリズムがあります。これらの特殊なアルゴリズムは、ファンクターを通じて実装されます。

問題は次のとおりです。コンパイル時にビルドされるコンテナーを実装する方法です。コアアルゴリズムは最初にこのコンテナーのサイズを確認できます (「4 つのアルゴリズムを取得しました -> アルゴリズム 0-3 をランダムに選択する必要があります」)そして、このコンテナーでファンクターを実行できます (「ランダムに選択された 2 -> コンテナー内の 3 番目のファンクターを処理する」)。

できるだけ簡単に実装するにはどうすればよいでしょうか。可能だと思います。

奇妙に繰り返されるテンプレートイディオムとの関連はありますか? (ウィキ リンク) Boost::Fusion
を使用する簡単な方法はありますか? (公式ドキュメント)

編集:すべてのアルゴリズムはコアアルゴリズムで使用されます。使用パターン (乱数) は実行時の決定です (したがって、コンパイル時のランドは必要ありません)。アルゴリズムは、安全にアクセスするために、ファンクターのコンテナーとこのコンテナーのサイズを認識している必要があります。

0 投票する
1 に答える
258 参照

c++ - このためのテンプレート メタプログラミング?

テンプレートのメタプログラミングなどを使用してこれを行う方法はありますか? それが役立つ場合は、いつでもポインタを使用してカテゴリ*にすることができます。

0 投票する
3 に答える
442 参照

c++ - オプションのコンパイル時パラメーターを使用してテンプレート化された関数を宣言する方法は?

このインターフェースの機能が欲しいです。

最初のコンパイル時パラメーターは型です。すべての関数呼び出しで必要です。
2 番目のコンパイル時パラメーターはオプションです。の動作を変更するために使用されfuncます。
関数自体は、通常のパラメーターの型 ( Type2) に基づいてテンプレート化されています。

このようなインターフェイスを構築できますか?

できない場合、同様の動作を取得する方法はありますか? たとえば、コンパイル時の 2 つのパラメーターを受け取るテンプレート化された関数のように機能するもので、2 番目のパラメーターはオプションですか?

素朴なアプローチは機能しません。

0 投票する
3 に答える
525 参照

c++ - タイプ名が関数ポインタのタイプ名であるかどうかを(コンパイル時に)どのように判断できますか?

Win32のランタイムダイナミックリンクメカニズムの次のラッパーを検討してください。

そしてサンプルクライアント:

基本的に、関数ポインタ型以外のGetFunction場所で誰かが使用しようとした場合にエラーメッセージを追加したいと思います(ここで使用することを余儀なくされると、ユーザーエラーが隠される可能性があるため)。Treinterpret_cast

ブーストタイプの特性を掘り下げてみると、既存のis_functionテンプレートがあることがわかりました。ただし、is_function関数への参照を受け入れます。これは、私の場合はユーザーエラーになります(関数ポインターのみ)。

関数ポインタ型でないRuntimeDynamicLinker::GetFunction<T>()場合、合理的に理解できるコンパイラエラーメッセージを生成するように変更するにはどうすればよいですか?T

(補足:私はいかなる種類のTMPも行ったことがないので、TMPの通常のユーザーにとって「基本的な」ことを恐れずに検討してください)

0 投票する
1 に答える
204 参照

c++ - スイッチド リターン

基本的に私がここでやりたいことは、呼び出し元が本質的に特定の型を要求し、ポインターまたは参照が返されるテンプレート化された関数呼び出しを行うことです。テンプレートで指定された型に基づいて、取得した未調整のポインターがポインターの場合はそれを返し、格納された値の場合は型を参照に切り替えたいと考えています。また、この考えを拡張して、参照、クラス、クラスへのポインターなどを含めたいと思います...

このコードは、出力 5 と 2 をそれぞれ実行したときに実行されます。

これを行う際の最初の問題は、これをやりたかった戻り値の型を定義することだったと思います

代わりは。これが機能しない理由がわかりません。想像できるすべての組み合わせで未解決のテンプレートエラーが発生するだけです。

私の 2 番目の問題は、さまざまな異なる戻り値の型を処理することです。これは少し試してみるつもりです。私が間違っている場合は修正してください。コンパイラは無効な戻り値を無視するように見えるため、末尾の戻り値の型は簡単に修正できます。これは単に ->decltype(T) を渡すだけでテストしたものですが、どこかでテストを間違えた可能性があります。

私がここに持っているものは、仕事を成し遂げるのに十分だと思います。なぜこれがそれほど素晴らしいアイデアではないのかについて、いくつかの意見があると思います。それらの意見を聞きたいです。

thx、BekaD:

0 投票する
2 に答える
11809 参照

vb.net - VB.NET ファイルの名前変更とタグ付けの変更 / 画像のメタデータの編集 / メタ タグ

説明:

外部 DLL を使用せずに、画像の EXIF / メタデータ / ファイル情報を編集して保存するにはどうすればよいですか?

計画:

個人用のアプリを作成して、個人の Web サイトでホストしている黙示録的な量の画像の名前を変更し、タグを付け直して、整理しています。私は数年間面白い写真などを集めてきたので、ファイルの命名規則に本当の韻や理由はありません. したがって、Image0001.jpg の名前をわかりやすいファイル名に変更し、メタデータ フィールドに入力する必要があります。

目的のプロセスは、既存の jpg、gif、png、tiff、または bmp を取得し、次のことを行います。

  1. イメージをメモリにロードする
  2. 必要に応じて bmp ファイルを jpg に変換します (ほとんどの場合、ファイル サイズを小さくするため)。
  3. 画像タグを ImageData 構造体に読み込みます (以下を参照)
  4. ファイルデータを ImageData 構造体に読み込みます (必要な場合)
  5. ユーザーが編集するための画像とタグを表示します (画像ボックスといくつかのテキスト ボックス内)。
  6. フィールドの編集とファイルの名前変更を許可する
  7. 変更を画像ファイルに書き込む
  8. 次のファイルに移動します。

例:

  1. Image0001.jpg を読み込みます。ImageData 構造フィールドに入力します。
  2. 説明に「lolcat 天井の猫が息子を送る」と入力します。
  3. ImageData.FileName を「lolcat-ceiling-cat-sends-son.jpg」に変更。
  4. ImageData.Name, .Keywords, .Title, .Subject, .Comments を「lolcat 天井の猫が息子を送る」に変更。
  5. 新しいファイル名でファイルを保存し、すべての新しいタグ フィールドを保存します。

(Later, I will also be using SQL to build a referential database with links to the online copies of these files to allow for searching by keywords, subject, filename, etc, but that's another layer that's much easier than this one. At least to me.)

Problem:

So far, several days of research have yielded almost no measurable progress. Information has apparently been inexplicably hidden behind a bunch of unexpected search keywords that I have not though to use for my searches. Any help would be appreciated.

Current Code as is:

And the current method for finding the data is:

Just a couple of the "Top Box" search hits I've reviewed:

  • The dso.DLL: Very Helpful, but undesirable. Requires external DLL.
    [http://]www.developerfusion.com/code/5093/retrieving-the-summary-properties-of-a-file/

  • 不完全なデータ ~ 私の質問に答えません
    [http://]msdn.microsoft.com/en-us/library/xddt0dz7.aspx

  • 外部 DLL が必要
    [http://]www.codeproject.com/KB/GDI-plus/ImageInfo.aspx

  • 外部ソフトウェアが必要
    [http://]stackoverflow.com/questions/3313474/write-metadata-to-png-image-in-net

  • 古いデータ ~ Visual Studio 2005 および .NET 2.0
    [http://]www.codeproject.com/KB/graphics/MetaDataAccess.aspx

  • BMP に変換: 便利
    そう [http://]www.freevbcode.com/ShowCode.Asp?ID=5799

0 投票する
6 に答える
2183 参照

c++ - 仮想関数を使用しない C++ 動的ディスパッチ

kind仮想関数の代わりにフィールドを使用して動的ディスパッチを行う従来のコードがあります。次のようになります。

PODクラスの関数メンバーは次のように実装されます。

POD::GetBar()POD::GetBaz()POD::GetXyzzy()、および他のメンバーも同様に実装されます。

この例は単純化されています。実際のコードには、 の約 12 の異なるサブタイプPODと、数十のメソッドがあります。の新しいサブタイプPODと新しいメソッドがかなり頻繁に追加されるため、そのたびにこれらすべてのswitchステートメントを更新する必要があります。

virtualこれを処理する一般的な方法は、クラスで関数メンバーを宣言することPODですが、オブジェクトが共有メモリに存在するため、これを行うことはできません。これらの構造体が単純な古いデータであることに依存するコードがたくさんあるため、共有メモリ オブジェクトで仮想関数を使用する方法を見つけられたとしても、それはしたくありません。

switchそのため、サブタイプ メソッドの呼び出し方法に関するすべての知識が、数ダースの関数内の数ダースのステートメントに分散するのではなく、1 か所に集中するように、これをクリーンアップする最善の方法に関する提案を探しています。

私が思いつくのはPOD、冗長性を最小限に抑えるためにテンプレートをラップして使用するある種のアダプター クラスを作成できるということです。しかし、その道を歩み始める前に、他の人がこれにどのように対処したかを知りたい.

0 投票する
4 に答える
888 参照

c++ - 関数に渡された引数がC ++のクラス、ユニオン、または列挙型であるかどうかを知る方法は?

すべての列挙型に対して operator<< を定義して、値を計算し、それが次のような列挙型であることを出力します。

コード:

出力:

is_enum構造体を使用して Boost ライブラリでこれを行う方法を知っています。しかし、私はそれがどのように機能するのか理解していません。そのため、一般的に、検証可能なものがクラス型、共用体型、または列挙型 (コンパイル時) であるかどうかを識別する方法に興味があります。

0 投票する
1 に答える
1456 参照

c++ - 精神期待の失敗を後押しする

次の構造体のベクトルを解析したいと思います。

私の文法は次のようになります。

私のHarnassは次のようになります。

ルール仕様をクリーネ閉包仕様からシーケンス一致に切り替えても、エラーは発生しません。

そうしないと、例文(harnassに表示)を解析しようとしたときに期待値エラーが発生します。

理想的には、このようなルールを書きたいと思いますdm_lines = +(data_member_line)(これも機能しません)。'*'および'+'演算子を使用すると、期待に失敗する原因は何ですか?しかし、シーケンスを照合するときはそうではありませんか?そして、どうすれば修正できますか。

0 投票する
3 に答える
958 参照

c++ - basic_string インスタンス化の検出

型が のインスタンス化であるかどうかを判断するために、次のコードを書きましたstd::basic_string

それを達成するためのより簡潔な方法はありますか?