問題タブ [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 投票する
1 に答える
250 参照

c++ - どのタイプからオブジェクトが構成されているかを見つける方法は?

わかりました、昨日、ほぼ同じ質問をここに投稿 しましたが、必要に応じて回答(機能)を変更できませんでした...他のトピックを台無しにしたくなかったので、新しいトピックを開始しました。

したがって、オブジェクトを構成できる2つの(実際には約15の)構造体があります

で、〜がある:

そして私はそれを次のように使いたい:

(int は単なる例です)

だから私はいくつかのテンプレートマジックを持っています:

しかし、私はそれを機能させることはできません:(

多くのコードがあることは知っていますが、これは実際には最小限の例です...読みやすくするために、このコードをideoneに投稿しました。

ありがとうございました!

編集:(コメントで質問するには)

私は AI 用のシステムを構築しており、コンパイル時にできるだけ多くのことを解決したいと考えています。この場合、移動動作のシステムを構築しています。私のコードは、「ポイントに移動する」、「回避する」、「障害物を回避する」などの多くのタイプの動作を提供します。これらの動作は、上記の例では A a、B です。この動作にはそれぞれ「performBehavior」のようなメソッドがあり、その戻り値の型は、他の「performBehavior」と組み合わせることができます。

そこで、コンパイル時の具体的な振る舞いをまとめたいと思います。例えば。AまたはA + C + D + Fなど...

そして、私の更新で次のようにします:

動作が「ポイントに移動」で構成されている場合は、「performBehaviorGoTo」よりも

行動が「Evade from」で構成されている場合は、「performBehaviorEvade」よりも

...

これは非常に短い説明ですが、私の主張がうまくいったことを願っています

0 投票する
15 に答える
6685 参照

c++ - 指定された数を保持するのに十分な大きさの変数型を自動的に選択します

おそらくいくつかの巧妙なテンプレートコードを使用して、最大で特定の数を保持するのに十分な大きさの型をC++で定義する方法はありますか? たとえば、私は書くことができるようになりたい:-

そして、その型は、指定された値を保持するのに十分な大きさの最小の型に解決されますか?

背景: 外部データ ファイルからスクリプトを使用して、いくつかの変数定義を生成する必要があります。スクリプトで値を確認し、値に応じて 、 、 などを使用できると思いますが、生成された C++ コードにサイズを組み込む方がuint8_tエレガントuint16_tに思えますuint32_t

これを行うことができるテンプレートを作成する方法はわかりませんが、C++ テンプレートを知っているので、方法があると確信しています。何か案は?

0 投票する
5 に答える
188 参照

c++ - このメタプログラミングはどのようにコンパイルされますか?

C++ テンプレートのメタプログラミングを表示するウィキペディアの例を次に示します。

特殊化が <0> になるまで、N のテンプレート パラメーター値を使用して Factorial の型を再帰的に作成する仕組みを理解しています。これにより、コンパイラーはチェーンの値を解決できます。

私の質問は次のとおりです。これはコンパイル後にどのように見えるでしょうか? コンパイラは文字通り、次のようなものを生成するだけになりますか?

または、結果はより複雑になりますか? 基本的に次の結果になるかどうか疑問に思っているので、私は尋ねています:

実行可能コードで定数 (24) に置き換えられているか、それよりも複雑な場合。これが完成したプログラムの効率にどのように役立つかを理解しようとしているだけなので、これは大いに役立ちます:)

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

c++ - C++03で「型を逆参照」する方法は?

C++03 で別の型の「逆参照型」を取得するにはどうすればよいですか? のような他の逆参照可能な型にすることができることに注意してくださいstd::vector<int>::iterator

たとえば、私が持っている場合

を何に置き換えるかはどうすればわかり???ますか?

( No Boost ! 自分で計算する方法を知りたいです。)

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

c++ - enable_if'dベースから継承

非charの配列の特性を部分的に特殊化しようとしています:

Visual Studio 2010は私にC2039を提供します( ...typeの要素ではありませenable_ifん)。ただし、SFINAEは、コンパイラエラーを発生させるのではなく、ここでボトムアウトするべきではありませんか?または、この場合、SFINAEは適用されませんか?

もちろん、非文字と文字の特殊化を分離することもできます。

しかし、この特定のケースでSFINAEが機能しない理由を本当に知りたいと思います。

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

c++ - 1つのインデックスのみに特化したC++メソッドテンプレート

クラスの1つのインデックスに対してのみテンプレートの特殊化を実行したいと思います。たとえば、次のコードでは、2番目のクラスが何であるかに関係なく、最初のクラスがintである場合は常に、特殊化を作成します。これを実装する方法はありますか?

0 投票する
17 に答える
11567 参照

c++ - コンパイル時の定数 ID

以下を考えると:

ID が T ごとに一意のコンパイル時 ID を生成するようにします。__COUNTER__ブースト PP ライブラリを検討しましたが、これまでのところ成功していません。どうすればこれを達成できますか?

編集: ID は、switch ステートメントのケースとして使用できる必要があります

Edit2: 静的メソッドまたはメンバーのアドレスに基づくすべての回答が正しくありません。これらは一意の ID を作成しますが、コンパイル時に解決されないため、switch ステートメントのケースとして使用できません。

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

c++ - boost::mpl::for_each のタイプ ラッパー エラー (Abrahams & Gurtovoy book のセクション 9.1.1)

次のコードは、David Abrahams と Aleksey Gurtovoy による著書 C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond のセクション 9.1.1 からほぼそのままコピーしたものです。

唯一の変更点は、通常の Boost テンプレート mpl::identity を使用して本から型ラッパー テンプレートを変更できるようにしたいということです。ただし、Microsoft Visual C++ Express 2010 (SP1) では、これを行うと謎のコンパイラ警告が表示されます。

型ラッパー テンプレートに「type」という名前の内部 typedef があるという事実に関係しているようです。その typedef を「Type」に変更する (または単にその行を削除する) と、コードが正しく機能します。この奇妙な動作について説明できる人はいますか?

の出力/I"C:\Program Files\boost\boost_1_47" /I"C:\Program Files\boost" /Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm- /EHsc /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Release\mpl.pch" /Fa"Release\" /Fo"Release\" /Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue:

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

c++ - 値の範囲に対するテンプレートの特殊化

に最も近いサイズの整数 (切り上げ) になるfooようなテンプレート構造を書きたいと思います。たとえば、と.foo<N>::value_typeNfoo<32>::value_type => uint32_tfoo<33>::value_type => uint64_tfoo<72>::value_type => uint64_t

これを行うには、たとえばuint8_t などを返すなどfoo、値の範囲に対して の部分的な特殊化を提供する洗練された手段が必要です。1 <= N <= 80 から 64 までのすべてを専門化する必要なく、これを達成する手段はありますか。

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

c++ - Boost MPL: (メンバー) 関数が存在する場合にのみ呼び出す

テンプレート パラメーター T を持つクラス A があります。クラス T が関数 func1() を提供するユース ケースと、T が提供しないユース ケースがあります。A の関数 f() は、存在する場合、func1() を呼び出す必要があります。これはブースト mpl で可能だと思いますが、方法がわかりません。ここにいくつかの擬似コードがあります:

さらに良いのは、else-case です。