問題タブ [c++20]
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.
c++ - __VA_OPT__ による再帰マクロ
で再帰マクロを書くことは合法__VA_OPT__
ですか?
GCC と Clang は再帰的に置き換えられないように見えますが、それが意図的なものかどうかはわかりません (__VA_OPT__
サポートはごく最近のことです)。
C++ 仕様 (§19.3.1/3:
__VA_OPT__
):それ以外の場合、置換は、再スキャンとさらなる置換の前に、現在の関数のようなマクロの置換リストとしてのコンテンツの展開の結果で構成されます
上記の強調表示されたセクションは、再帰が不可能であることを意味しますか?
たとえば、可変長マクロ パラメーターのリストを追加するには、次のようにします。
GCC と Clang はどちらもRECURSE
、後処理で生成されます。
注: これが可能であれば、連結などのより複雑な可変個引数マクロをかなり簡単に記述できます。これは、カスタム__VA_NO_OPT__
fromを作成できるため__VA_OPT__
です。これにより、1 および 2+ パラメータに対して完全に別個のコードを提供できます。
c++ - 並列アルゴリズムでの range::view::iota の使用
c++17にはアルゴリズムのインデックスベースの並列がないため、それをエミュレートするために と組み合わせて使用できるかどうか疑問に思っています。あれは:ranges::view::iota
std::for_each
iota_view
適切なタイプ( [range.iota.iterator] )のランダムアクセスを提供しているようです:
iota_view<I, Bound>::iterator::iterator_category
は次のように定義されます。(1.1) —
I
モデルAdvanceable
の場合、iterator_category
は ですrandom_access_iterator_tag
。(1.2) — そうではなく、
I
modelsDecrementable
の場合iterator_category
は ですbidirectional_iterator_tag
。(1.3) — それ以外の場合、
I
modelsIncrementable
の場合iterator_category
は ですforward_iterator_tag
。(1.4) — それ以外の場合
iterator_category
は ですinput_iterator_tag
。
上記のコードは正しいですか?iota_view
この方法を使用すると、パフォーマンスが低下することはありますか?
編集: range-v3、cmcstl2、および Intel のPSTLでいくつかのテストを行いました。
range-v3 を使用すると、上記の例は GCC 8 でのコンパイルに失敗しbegin
ますend
。
cmcstl2 を使用すると、コードはきれいにコンパイルされますが、並列には実行されません。おそらくフォワードイテレータの要件が何らかの形で満たされていないため、順次バージョンにフォールバックしているように思えます( https://godbolt.org/z/yvr-M2 )。
多少関連する PSTL の問題があります ( https://github.com/intel/parallelstl/issues/22 )。
c++ - `std::shared_ptr` はデフォルトで `std::default_delete` を使用すべきではありませんか?
std::default_delete
を使用する代わりにカスタムの destroy-function を呼び出すことでstd::unique_ptr
、 s が破棄する必要のある型を簡単に管理できるように特化することができます。delete p;
オブジェクトがstd::shared_ptr
C++ でa によって管理されていることを確認するには、基本的に 2 つの方法があります。
std::make_shared
またはを使用して、共有ポインタによって管理されるように作成しますstd::allocate_shared
。これは、必要な両方のメモリ ブロック (ペイロードと参照カウント) を 1 つに結合するため、推奨される方法です。sしか残っていない場合std::weak_ptr
でも、参照カウントが必要なため、必然的にペイロード用のメモリも固定されます。その後、コンストラクターまたはを使用して、管理を共有ポインターに割り当てます
.reset()
。
2 番目のケースは、カスタムのデリータを提供しない場合に興味深いものです。
具体的には、配列に対してインスタンス化されているかどうかに応じて、delete [] p;
またはをそれぞれ使用する、指定されていないタイプの独自のデリータを使用するように定義されています。delete p;
std::shared_ptr
n4659 からの引用 (~C++17):
4 Requires:
Y
完全型でなければならない。式が配列型のdelete[] p
場合T
、または が配列型でないdelete p
場合、T
式は明確に定義された動作をし、例外をスローしません。
5 効果:T
が配列型でない場合shared_ptr
、ポインタを所有するオブジェクトを構築しますp
。それ以外の場合は、shared_ptr
を所有するp
と、 を呼び出す未指定の型の削除子を構築しますdelete[] p
。が配列型でない場合T
、 で有効shared_from_this
になりp
ます。例外がスローされた場合、が配列型でないdelete p
場合に呼び出され、それ以外の場合に呼び出されます。 6 事後条件: . […]T
delete[] p
use_count() == 1 && get() == p
3つの効果: と同等
shared_ptr(p).swap(*this)
。
私の質問は次のとおりです。
std::default_delete
代わりに使用するように指定されていない、できれば正当な理由はありますか?- 有効な (そして潜在的に有用な) コードは、その変更によって壊れますか?
- そうする提案はすでにありますか?
c++ - 概念を使用してクラス テンプレートのメンバー関数を有効にする
だから私はコンセプトを持っていますFooable
:
Bar
そして、型をテンプレート パラメーターとして受け取るクラス テンプレートがあり、次の場合にT
のみメンバー関数を有効にしたい:T
Fooable
概念TSまたはC++2aを備えたC++17で可能ですか?