問題タブ [static-if]
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.
static - 静的ifを持つD以外の言語はありますか?
static if
Dは興味深い言語機能だと思います。それは私の質問を促します.コンパイラがコードの強い概念を持ち、それらにアクセスするための言語機能があるコンパイル済み言語の他の例はありますか?
たとえば、次のコードはrepr
Pythonと同様のものを提供します。
これは、このような機能と比較して、コードをより動的にするための裏返しの方法である、オーバーロードが行うことに対する別のより一般的なアプローチを可能にするため、これはクールだと思います。たとえば、コンパイラはクラスに含まれるフィールドの数を認識していますが、ほとんどの言語では、コードがコンパイル時にその情報にアクセスする方法がありません。
警告: 最後の段落には意見が含まれていましたが、論争を誘発するのではなく、私の質問の動機と説明を提供するつもりです。他のコンパイル済み言語にそのような機能があるかどうかを知りたいだけです。
terminology - Dの「静的if」は宣言型ですか、それとも手続き型ですか?
次のコードを検討してください。
私の当初の理解では、Dでは(グローバルスコープでの)宣言の順序は重要ではありません。
ただし、この場合、static if
sの順序によって、プログラムがコンパイルされるかどうかが異なります。
したがって、Dのコンパイル時の評価段階は、手続き型機能(C / C ++など)、宣言型機能、またはその他のものですか?それは現在何ですか、そしてそれは何になる予定ですか(2つが異なる場合)?
編集:
問題はここで終わらないことに気づきました。現在のモジュールのメンバーを列挙し、同じタイプの問題を作成するためのstatic if
使用はどうなりますか?.tupleof
c++ - プレーンC++の場合は静的ですか?
要するに問題: c ++11で提案された機能をプレーンなc++で
どのように実装できるでしょうか?static if
歴史と元々の問題:
最近、私はこのような問題を思いついた。Sender
次のようなインターフェイスを持つクラスが必要です
場合によっては、DoubleSender、つまりこのクラスのインスタンスを作成する必要があります。これは、そのメソッドを2回呼び出します。つまり、たとえばメソッドを呼び出すときはsendMessage(...)
、同じメッセージを2回送信する必要があります。
私の解決策:
最初の
アプローチ:メンバーを用意し、各メソッド呼び出しの最後にチェックを行いますisDouble
ええと、私はこれを望んでいません。なぜなら、実際にはごく最近二重投稿が必要になり、タイムクリティカルセクションのコードのこの部分は98%パッシブになるからです。
2番目のアプローチ:から
クラスを継承し、次のようなメソッドを実装します。DoubleSender
Sender
send..
まあ、これは許容できますが、不快なコードの多くのスペースを必要とします(さまざまなメソッドがたくさんあるため、実際には多くのスペースが必要です。
3番目のアプローチ:
c++11を使用していると想像してください:)。次に、このクラスをジェネリックにし、次を使用して一時的な引数に従ってコードの必要な部分を生成できますstatic if
。
これは以前のソリューションよりも短く、読みやすく、追加のコードを生成しません...それはc ++ 11ですが、残念ながら私の作業では使用できません。
だから、ここで私は私の質問に行き着きました-どうすればstatic if
c ++でアナログを実装できますか?
また、私の元の問題を解決する方法について他の提案をいただければ幸いです。
前もって感謝します。
c++ - 「静的-if」はクラスまたは関数テンプレートの方が優れていますか?
true
テンプレートの引数に応じて、シリアル化コード( )または何も実行されない()変数をシリアル化するためのインターフェイスを定義したいと思いますfalse
。シリアル化関数自体は、アーカイブ型と変数型でテンプレート化されています。
シリアル化関数を部分的に特殊化するのが良いですか、それとも内部に静的メソッドを持つクラスを特殊化するのが良いですか?以下のコードは正しいですか?もっと良い方法はありますか?
これは私の疑似コードであり、機能するかどうかはわかりません。
クラスアプローチは次のようになります。
部分的な特殊化は次のようになります(構文はおそらく間違っています):
c++ - Faking Static If in C++
I am testing combinations of various optimizations and for these I need a static-if as described in http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Static-If-I-Had-a-Hammer to enable and disable specific optimizations. if(const-expr) does not always work as some optimizations involve changing the data layout and this can not be done at function scope.
Basically what I want is this:
(Yes, the smaller memory footprint of removing b from the data layout is relevant in my case.)
Currently I am faking it using a very bad hack. I am looking for a better way of doing this.
File a.h
File b.h (this file is autogenerated from a Python script)
File c.h
Does anyone know of a better way of doing this? Theoretically it can be done using template meta programming and at first I used it. At least the way I used it was a pain in the ass and lead to completely unreadable and bloated code. Using the hack above resulted in a significant productivity boost.
EDIT: I have several optimization flags and these interact.
c++ - static_if はテンプレートの特殊化を廃止しますか?
次のような通常のテンプレートの特殊化:
次のように表すことができますstatic_if
。
これらは直接競合する機能ですか? テンプレートの特殊化でstatic_if
できないことはできますか? static_if
テンプレートの特殊化でできることはすべてできるようです。
余談ですがstatic_if
、このコンテキストはあまり好きではありません。これは、特定の状況でインターフェイスのどの部分を使用できるかがわかりにくくなる可能性があるためです。場合によっては、テンプレートの特殊化により、より明確な構文が提供される可能性があります。
c - C99 のプリプロセッサの static_if
C99 で static_if を実装することは可能ですか?
ここで適切に実装するにはどうすればよいSTATIC_IF(…)
ですか? 引数に応じてまたはにCOND
渡す必要がありますが、両方のマクロの引数は異なって見えます。のようなもので、静的にテスト可能です。MACRO1
MACRO2
COND
sizeof (…) > 42
#if COND
それから#define STATIC_IF MACRO1
…私のユースケースではうまくいきません。- コンパイラ固有のソリューションを使用できません。
c++ - ランタイム #ifdef とほぼ同等の C++ プログラミング手法はありますか?
たとえば、一部のコードに関数呼び出しがあり、好きなように有効/無効にしたいと考えています。
通常、if を使用するだけで済みますが、関数を実行できるかどうかを毎回チェックすることになり、これは望ましくありません。コードでそのチェックを行わないようにしたいだけです。
ifdef ブロックは、ごちゃごちゃしていて非常に汚れている可能性があり、積み重なってコードが読みにくくなります。
ある種のテンプレートでこれを解決できませんか? 複数のラムダを作成して、必要な関数呼び出しの各バージョンをビルドできることはわかっています。
これは静的な if の意味ですか? 私の考えでは、私がやりたいのは自己変更コードであり、それが良いアイデアなのか、それとも可能かどうかはまったくわかりません。