Pengenalan terbaik untuk pemrograman metaprogram C ++? [Tutup]

112

Metaprogramming statis (alias "template metaprogramming") adalah teknik C ++ hebat yang memungkinkan eksekusi program pada waktu kompilasi. Sebuah bola lampu padam di kepala saya segera setelah saya membaca contoh pemrograman metaprogram kanonik ini:

#include <iostream>
using namespace std;

template< int n >
struct factorial { enum { ret = factorial< n - 1 >::ret * n }; };

template<>
struct factorial< 0 > { enum { ret = 1 }; };

int main() {
    cout << "7! = " << factorial< 7 >::ret << endl; // 5040
    return 0;
}

Jika seseorang ingin mempelajari lebih lanjut tentang pemrograman metaprogram statis C ++, apa sumber terbaiknya (buku, situs web, perangkat kursus online, apa pun)?

jwfearn
sumber
43
bohlam berbunyi 'mati' atau 'hidup'?
horseyguy
36
Mati. Pasti pergi.
Thomas Eding

Jawaban:

108

[Menjawab pertanyaan saya sendiri]

Perkenalan terbaik yang pernah saya temukan sejauh ini adalah bab 10, " Pemrograman Metapetik Statis dalam C ++" dari Pemrograman Generatif, Metode, Alat, dan Aplikasi oleh Krzysztof Czarnecki dan Ulrich W. Eisenecker, ISBN-13: 9780201309775; dan bab 17, "Metaprogram" dari Template C ++: Panduan Lengkap oleh David Vandevoorder dan Nicolai M. Josuttis, ISBN-13: 9780201734843.

alt teks alt teks alt teks alt teks

Todd Veldhuizen memiliki tutorial yang sangat bagus di sini .

Sumber yang bagus untuk pemrograman C ++ secara umum adalah Modern C ++ Design oleh Andrei Alexandrescu, ISBN-13: 9780201704310. Buku ini menggabungkan sedikit metaprogramming dengan teknik template lainnya. Khususnya untuk metaprogram, lihat bagian 2.1 "Pernyataan Waktu Kompilasi", 2.4 "Memetakan Konstanta Integral ke Jenis", 2.6 "Pemilihan Jenis", 2.7 "Mendeteksi Konvertibilitas dan Warisan pada Waktu Kompilasi", 2.9 " NullTypedan EmptyType" dan 2.10 "Sifat Jenis ".

Sumber daya menengah / lanjutan terbaik yang pernah saya temukan adalah C ++ Template Metaprogramming oleh David Abrahams dan Aleksey Gurtovoy, ISBN-13: 9780321227256

Jika Anda lebih suka hanya satu buku, dapatkan C ++ Templates: The Complete Guide karena ini juga merupakan referensi definitif untuk template secara umum.

jwfearn
sumber
2
Tautan ke karya Todd Veldhuizen sudah basi.
John R. Strohm
1
tautan diperbaiki sekarang, terima kasih!
jwfearn
Tautannya rusak lagi!
Paul
1
Terima kasih @jwfearn, saya membaca artikelnya, meskipun menurut saya ini lebih menarik: youtube.com/watch?v=Am2is2QCvxY (memiliki dua bagian). Ini adalah ceramah oleh Walter E.Brown: Modern Template Metaprogramming: A Compendium
Paul
24

Buku Desain C ++ Modern Andrei Alexandrescu mencakup banyak hal ini dan trik lainnya untuk kode C ++ modern yang cepat dan efisien dan merupakan dasar dari perpustakaan Loki .

Yang juga perlu disebutkan adalah perpustakaan Boost , yang banyak menggunakan teknik ini dan biasanya berkualitas sangat tinggi untuk dipelajari (meskipun beberapa di antaranya cukup padat).

Alaric
sumber
12

Modern C ++ Design , buku brilian dan kerangka pola desain oleh Alexandrescu. Peringatan, setelah membaca buku ini saya berhenti menggunakan C ++ dan berpikir "Apa-apaan ini, saya bisa memilih bahasa yang lebih baik dan mendapatkannya secara gratis".

Florian Bösch
sumber
5
"Apa sih, saya bisa memilih bahasa yang lebih baik dan mendapatkannya secara gratis" Ummm, apa maksud Anda? Saya sangat bingung dengan "gratis". Dan bahasa apa lagi yang kamu pikirkan?
Pop Catalin
12
Pemrograman template C ++ memberi Anda semua jenis kemampuan baru seperti jenis lewat atau daftar jenis sebagai argumen, dll. Sebagian besar kemampuan ini hadir dalam bahasa yang diketik secara dinamis seperti python, dengan sintaks yang lebih baik.
Florian Bösch
1
Jika Anda mencari bahasa yang dapat membuat program yang benar dengan cepat, Python lebih baik daripada C ++. Jika Anda memerlukan beberapa hal lain yang disediakan C ++, menambahkan kemampuan mirip Lisp ke C ++ mungkin lebih baik daripada mencoba C ++ - jika menggunakan bahasa lain.
David Thornley
6

Dua buku bagus yang muncul di benak adalah:

  • Desain C ++ Modern / Andrei Alexandrescu (Sebenarnya sudah berusia 7 tahun meskipun namanya!)
  • Template C ++: Panduan Lengkap / Vandevoorde & Josuttis

Ini merupakan bidang yang cukup mendalam, jadi buku yang bagus seperti salah satunya pasti direkomendasikan melalui situs web. Beberapa dari teknik yang lebih maju akan membuat Anda mempelajari kode selama beberapa waktu untuk mengetahui cara kerjanya!

Nik
sumber
5

Modern C ++ adalah salah satu pengantar terbaik yang pernah saya baca. Ini mencakup contoh yang benar-benar berguna dari metaprogramming template. Lihat juga perpustakaan pendamping Loki .

Gerhana
sumber
5

Tidak akan ada banyak daftar buku, karena daftar orang dengan banyak pengalaman terbatas. Pemrograman template dimulai secara nyata sekitar Lokakarya Pemrograman Template C ++ pertama pada tahun 2000, dan banyak penulis yang disebutkan sampai saat ini hadir. (IIRC, Andrei tidak.) Para pionir ini sangat mempengaruhi lapangan, dan pada dasarnya apa yang harus ditulis sekarang ditulis. Secara pribadi, saya akan menasihati Vandevoorde & Josuttis. Buku Alexandrescu adalah buku yang sulit jika Anda baru di bidang ini.

MSalters
sumber
4

Makalah asli Veldhuizen bagus. Jika Anda ingin mendapatkan satu buku utuh, maka ada buku Vandevoorde "C ++ Templates Complete Guide". Dan ketika Anda siap untuk kursus master, cobalah Desain C ++ Modern Alexandrescu.

eduffy
sumber
4

google Alexandrescu, C ++ Desain Modern: Pemrograman Generik dan Pola Desain Diterapkan

Maxim Ananyev
sumber