(Catatan: tuple
dan tie
dapat diambil dari Boost atau C ++ 11.)
Saat menulis struct kecil dengan hanya dua elemen, saya terkadang cenderung memilih a std::pair
, karena semua hal penting sudah dilakukan untuk tipe data itu, seperti operator<
untuk pengurutan yang ketat-lemah .
Kerugiannya adalah nama variabel yang tidak berguna. Bahkan jika saya sendiri yang membuatnya typedef
, saya tidak akan ingat 2 hari kemudian apa first
dan apa second
sebenarnya itu, terutama jika keduanya memiliki tipe yang sama. Ini menjadi lebih buruk untuk lebih dari dua anggota, karena bersarang pair
cukup menyebalkan.
Opsi lain untuk itu adalah atuple
, baik dari Boost atau C ++ 11, tetapi itu tidak terlihat lebih bagus dan lebih jelas. Jadi saya kembali menulis struct sendiri, termasuk operator perbandingan yang diperlukan.
Karena khususnya operator<
bisa sangat rumit, saya berpikir untuk menghindari seluruh kekacauan ini hanya dengan mengandalkan operasi yang ditentukan untuk tuple
:
Contoh dari operator<
, misalnya untuk pengurutan-ketat-lemah:
bool operator<(MyStruct const& lhs, MyStruct const& rhs){
return std::tie(lhs.one_member, lhs.another, lhs.yet_more) <
std::tie(rhs.one_member, rhs.another, rhs.yet_more);
}
( tie
Membuat tuple
dari T&
referensi dari argumen berlalu.)
Sunting : Saran dari @DeadMG untuk mewarisi secara pribadi tuple
bukanlah hal yang buruk, tetapi ada beberapa kekurangan:
- Jika operatornya berdiri bebas (mungkin teman), saya perlu mewarisi secara publik
- Dengan transmisi, fungsi / operator saya (
operator=
secara khusus) dapat dengan mudah dilewati - Dengan
tie
solusinya, saya dapat meninggalkan anggota tertentu jika mereka tidak peduli dengan pemesanan
Apakah ada kekurangan dalam penerapan ini yang perlu saya pertimbangkan?
tie
tidak dapat diterapkan pada anggota bit-field.tie(...)
panggilan akan diduplikasi di berbagai operator (=, ==, <, dll.) Anda dapat menulis metode inline pribadimake_tuple(...)
untuk merangkumnya dan kemudian memanggilnya dari berbagai tempat lain, seperti direturn lhs.make_tuple() < rhs.make_tuple();
(meskipun tipe kembalian dari metode itu bisa menyenangkan untuk diumumkan!)auto tied() const{ return std::tie(the, members, here); }
Jawaban:
Hal ini tentunya akan mempermudah penulisan operator yang benar daripada menggulungnya sendiri. Saya katakan hanya pertimbangkan pendekatan yang berbeda jika pembuatan profil menunjukkan operasi perbandingan menjadi bagian yang memakan waktu dari aplikasi Anda. Jika tidak, kemudahan pemeliharaan ini harus lebih besar daripada kemungkinan masalah kinerja.
sumber
tuple<>
'soperator<
akan ada lebih lambat dari satu tulisan tangan.Saya telah menemukan masalah yang sama ini dan solusi saya menggunakan template variadic c ++ 11. Inilah kodenya:
Bagian .h:
Dan .cpp untuk kasus dasar tanpa argumen:
Sekarang contoh Anda menjadi:
sumber
Menurut pendapat saya, Anda masih belum menangani masalah yang sama dengan
std::tuple
pemecahannya - yaitu, Anda harus tahu berapa banyak dan nama setiap variabel anggota, Anda menduplikasinya dua kali dalam fungsi. Anda bisa memilihprivate
warisan.Pendekatan ini adalah sedikit sedikit lebih berantakan untuk memulai dengan, tetapi Anda hanya mempertahankan variabel dan nama di satu tempat, bukan di setiap tempat untuk setiap operator yang ingin Anda overload.
sumber
T& one_member(){ return std::get<0>(*this); }
dll? Tapi bukankah itu membutuhkan saya untuk menyediakan metode seperti itu untuk setiap "anggota" yang saya miliki, termasuk kelebihan beban untuk versi const dan non-const?Jika Anda berencana untuk menggunakan lebih dari satu operator overload, atau lebih banyak metode dari tuple, saya sarankan menjadikan tuple sebagai anggota kelas atau berasal dari tuple. Jika tidak, yang Anda lakukan adalah lebih banyak pekerjaan. Ketika memutuskan di antara keduanya, pertanyaan penting untuk dijawab adalah: Apakah Anda ingin kelas Anda seperti itu tuple? Jika tidak, saya akan merekomendasikan berisi tuple dan membatasi antarmuka dengan menggunakan delegasi.
Anda dapat membuat pengakses untuk "mengganti nama" anggota tupel.
sumber
operator<
menggunakanstd::tie
masuk akal?" Saya tidak mengerti bagaimana jawaban ini berhubungan dengan pertanyaan itu.