C ++コンパイル時間カウンター、再訪
TL; DR この投稿全体を読む前に、次のことを知っておいてください。 提示された問題の解決策は自分で見つけましたが、分析が正しいかどうかを知りたいと思っています。 fameta::counter残りのいくつかの癖を解決するクラスにソリューションをパッケージ化しました。githubで見つけることができます。 godboltの作業でそれを見ることができます。 すべての始まり FilipRoséenが発見/発明して以来、2015年に、時間カウンターをコンパイルするブラックマジックはC ++にあるため、デバイスにややこだわっていたため、CWG が機能を実行する必要があると判断したときはがっかりしましたが、彼らの心はいくつかの説得力のある使用例を示すことで変更できます。 次に、数年前、私はそのことをもう一度確認することにしました。これにより、uberswitch esを入れ子にできるようになりました-私の意見では興味深いユースケースです- の新しいバージョンではもはや機能しないことを発見しただけです。問題2118がオープン状態であっても(現在も)利用可能なコンパイラー:コードはコンパイルされますが、カウンターは増加しません。 この問題は、RoséenのWebサイト、および最近ではstackoverflowでも報告されています。C++はコンパイル時カウンターをサポートしていますか? 数日前、もう一度問題に取り組み、取り組むことを決めました コンパイラーの何が変わったのかを理解したかったのです。そのために、私は誰かがそれについて話してくれるようにインターウェブをずっと遠くまで検索しましたが、役に立ちませんでした。だから私は実験を始め、いくつかの結論に達しました。私はここで提示しているのですが、ここでは自分よりも知識のある人からフィードバックを得たいと思っています。 以下では、わかりやすくするために、Roséenの元のコードを示します。それがどのように機能するかの説明については、彼のウェブサイトを参照してください: template<int N> struct flag { friend constexpr int adl_flag (flag<N>); }; template<int N> struct writer { friend constexpr int adl_flag (flag<N>) { return N; } static constexpr int value = N; }; template<int …