問題タブ [std-source-location]
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++ - std::experimental::source_location はどのように実装できますか?
C++ Extensions for Library Fundamentals、バージョン 2 ( N4564 ) では type が導入されていstd::experimental::source_location
ます。
§ 14.1.2 [reflection.src_loc.creation] は次のように述べています。
戻り値: postfix-expressionが (括弧で囲まれている可能性がある) id-expression Namingである関数呼び出し (C++14 § 5.2.2) によって呼び出されると、実装定義の値を持つ を
current
返します。source_location
値は、 および と#line
同じ方法で (C++14 § 16.4) の影響を受ける必要が__LINE__
あり__FILE__
ます。他の方法で呼び出された場合、返される値は規定されていません。備考:ブレースまたはイコール初期化子を使用して非静的データ メンバーを初期化する場合、すべての呼び出しは、
current
メンバーを初期化するコンストラクターまたは集約の初期化の場所に対応する必要があります。[注:デフォルトの引数 (C++14 § 8.3.6) として使用される場合、の値は呼び出しサイトでの呼び出し
source_location
の場所になりcurrent
ます。—エンドノート]
私の理解が正しければ、この機能はこのように使用されることを意図しています。
期待される出力:
がなければ、例外オブジェクトを適切に初期化するためにおよびマクロを内部的にstd::experimental::source_location
使用するヘルパー マクロを使用した可能性があります。THROW_WITH_SOURCE_LOCATION
__FILE__
__LINE__
ライブラリがどのように実装できるのか疑問に思っていましたstd::experimental::source_location
。私が要点を完全に見逃していない限り、そうするのは特別なコンパイラ サポートなしでは不可能です。しかし、これを機能させるには、どのような魔法のコンパイラ機能が必要でしょうか? に展開されたトリックに匹敵しstd::initializer_list
ますか?この機能の実験的な実装はありますか? GCC の SVN ソースを確認しましたが、まだ何も見つかりませんでした。
c++ - std::experimental::source_location のビジュアル スタジオでの実装
の合理的に準拠したバージョンは、、などstd::experimental::source_location
を使用して gcc に実装できます。Visual Studio 2017 には同様の組み込み関数が存在しますか? または、Visual Studio 2017 で実装する方法はありますか?__builtin_FILE()
__builtin_LINE()
std::experimental::source_location
c++ - デフォルトの引数であるマクロを呼び出しサイトで展開することは可能ですか?
この場合の__LINE__
マクロは 3 に展開されるため、print 関数は同じ値で 4 回呼び出されます。C++ 11 に存在する機能では6,7,8,9
なく、印刷関数が呼び出されるように、呼び出しサイトでこのマクロを展開するようにコンパイラーを説得する方法はありますか?3,3,3,3
私のユースケース:
私のアプリケーションでは、一意の ID を取る複数の関数を提供しています。ID は callsite/location ごとに一意である必要があります (そのため、関数が同じステートメントで 2 回呼び出された場合、同じ ID を受け取る必要があります)。現在、ユーザーはLOCATION
次のように呼び出しサイトでマクロを手動で入力する必要があります。
次のように関数ごとにマクロを作成せずに、入力を省略できればもっと便利です。
したがって、デフォルトの引数でうまくいくと思いました。これを達成する方法はありますか?
c++ - std::source_location の getter が [[nodiscard]] としてマークされていないのはなぜですか?
によると: https://en.cppreference.com/w/cpp/utility/source_location
ゲッターは [[nodiscard]] としてマークされていません。
これには理由がありますか?戻り値以外に呼び出されたときに効果がありますか?