Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mencapai Rujukan Kendiri dalam Kelas C Tanpa Mengulang Nama Kelas?

Bagaimanakah Saya Boleh Mencapai Rujukan Kendiri dalam Kelas C Tanpa Mengulang Nama Kelas?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-03 14:35:14219semak imbas

How Can I Achieve Self-Referencing in C   Classes Without Repeating the Class Name?

Kelas Rujuk Kendiri dalam C tanpa Pengulangan

C tidak menawarkan kata kunci yang setara dengan kata kunci kendiri PHP, yang mewakili jenis lampiran kelas. Untuk menirunya untuk kelas tertentu, seseorang boleh mentakrifkan:

struct Foo { typedef Foo self; };

Walau bagaimanapun, ini memerlukan pengulangan nama kelas, meninggalkan ruang untuk pepijat senyap. Adakah terdapat cara "autonomi" untuk mencapai ini menggunakan decltype dan rakan?

Sintaks berikut gagal disebabkan penggunaan tidak sah ini di peringkat atas:

struct Foo { typedef decltype(*this) self; };

Satu penyelesaian melibatkan memperkenalkan kelas templat Diri seperti berikut:

template <typename... Ts>
class Self;

template <typename X, typename... Ts>
class Self<X, Ts...> : public Ts... {
  typedef X self;
};

Makro kemudiannya boleh digunakan untuk memudahkan kelas takrifan:

#define WITH_SELF(X) X : public Self<X>
#define WITH_SELF_DERIVED(X, ...) X : public Self<X, __VA_ARGS__>

class WITH_SELF(Foo) {
  void test() { self foo; }
};

Derivasi boleh dikendalikan dengan:

class WITH_SELF_DERIVED(Bar, Foo) {
  /* ... */
};

Pewarisan berbilang dan makro variadik membolehkan penyepaduan mudah dengan hierarki kelas yang kompleks:

class WITH_SELF(Foo2) { /* ... */ };

class WITH_SELF_DERIVED(Bar2, Foo, Foo2) {
  /* ... */
};

Teknik ini telah diuji dan disahkan dengan kedua-dua GCC 4.8 dan Clang 3.4.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Rujukan Kendiri dalam Kelas C Tanpa Mengulang Nama Kelas?. 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