Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengaturcaraan Meta Stateful dalam C : Teknik Undang-undang dalam C 14, Tetapi Adakah Itu Akan Berubah dalam C 17?

Pengaturcaraan Meta Stateful dalam C : Teknik Undang-undang dalam C 14, Tetapi Adakah Itu Akan Berubah dalam C 17?

DDD
DDDasal
2024-11-20 18:52:16802semak imbas

Stateful Metaprogramming in C  : A Legal Technique in C  14, But Will That Change in C  17?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn