Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mencapai Rujukan Kendiri dalam Kelas C Tanpa Mengulang Nama Kelas?
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!