Stateful Metaprogramming: Adakah Ia Masih Sah dalam C
Salah satu daripada teknik metaprogramming yang lebih kontroversi dalam C , stateful metaprogramming, bergantung pada konsep kaunter constexpr untuk menyimpan dan mendapatkan semula keadaan pengaturcaraan meta. Seperti sedia ada, teknik ini adalah sah di bawah C 14. Walau bagaimanapun, ini menimbulkan persoalan sama ada ini akan berubah dengan pengenalan C 17.
Untuk memahami isu yang dihadapi, pertimbangkan pelaksanaan berikut berdasarkan a jawatan sebelumnya:
// State storage flag template <int N> struct flag { friend constexpr int adl_flag(flag<N>&); constexpr operator int() { return N; } }; // State writer template <int N> struct write { friend constexpr int adl_flag(flag<N>) { return N; } static constexpr int value = N; }; // State reader template <int N, int = adl_flag(flag<N>{})> constexpr int read(int, flag<N>, int R = read(0, flag<N + 1>{})) { return R; } // Stateful counter template <int N = 0> constexpr int counter(int R = write<read(0, flag<0>{}) + N>::value) { return R; }
Teknik ini digunakan seperti berikut:
// Check if counter is stateful with static assertion static_assert(counter() != counter(), "Your compiler is mad at you"); // Template specialization based on counter state template<int = counter()> struct S {}; // Check if template specializations differ with static assertion static_assert(!std::is_same_v<S<>, S<>, "This is ridiculous");
Walau bagaimanapun, kesahihan pengaturcaraan meta stateful dipersoalkan dengan CWG Active Issue 2118. Isu ini mencadangkan bahawa menggunakan fungsi rakan dalam templat untuk menangkap dan mendapatkan semula keadaan pengaturcaraan meta harus dianggap tidak betul kerana sifatnya yang misterius.
Sehingga Mei 2015, CWG bersetuju bahawa teknik sedemikian harus dilarang tetapi masih belum menentukan mekanisme yang betul. Isu ini kekal aktif dan sehingga keputusan dibuat, pengaturcaraan meta stateful akan kekal sah dalam C . Walau bagaimanapun, apabila mekanisme larangan diwujudkan, teknik ini boleh diisytiharkan secara retroaktif sebagai laporan kecacatan.
Atas ialah kandungan terperinci Pengaturcaraan Meta Stateful dalam C : Teknik Undang-undang dalam C 14, Tetapi Adakah Itu Akan Berubah dalam C 17?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!