web-dev-qa-db-ja.com

C ++テンプレートメタプログラミングのベストイントロダクション?

静的メタプログラミング(別名「テンプレートメタプログラミング」)は、コンパイル時にプログラムを実行できる優れたC++手法です。この標準的なメタプログラミングの例を読むとすぐに、電球が頭の中で消えました。

#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;
}

C++の静的メタプログラミングについて詳しく知りたい場合、最良のソース(書籍、Webサイト、オンラインコースウェアなど)は何ですか?

112
jwfearn

[自分の質問に答える]

これまでに見つけた最良の紹介は、Krzysztof CzarneckiによるGenerative Programming、Methods、Tools、およびApplicationsの第10章「C++の静的メタプログラミング」です。およびUlrich W. Eisenecker、ISBN-13:9780201309775; ISBN-13:9780201734843のDavid VandevoorderとNicolai M. JosuttisによるC++テンプレート:The Complete Guideの第17章「メタプログラム」。

alt textalt textalt textalt text

Todd Veldhuizenには素晴らしいチュートリアルがあります こちら

C++プログラミングの一般的なリソースは、Andrei Alexandrescu、ISBN-13:9780201704310によるModern C++ Designです。この本は、他のテンプレートとメタプログラミングを少し混ぜたものです。テクニック。特にメタプログラミングについては、セクション2.1「コンパイル時のアサーション」、2.4「型への整数定数のマッピング」、2.6「型の選択」、2.7「コンパイル時の変換性と継承の検出」、2.9「NullTypeEmptyType "および2.10" Type Traits "。

私が見つけた最高の中間/高度なリソースは、C++ Template MetaprogrammingDavid Abrahams and Aleksey Gurtovoy、ISBN-13:9780321227256

1冊の本だけが必要な場合は、C++ Templates:The Complete Guideを入手してください。これは、一般的なテンプレートの決定的なリファレンスでもあるためです。

107
jwfearn

Andrei Alexandrescuの Modern C++ Design 本は、スピーディで効率的な最新のC++コードのための多くのトリックとその他のトリックをカバーしており、 Loki ライブラリの基礎となっています。

また、言及する価値があるのは Boost ライブラリです。これらのテクニックは頻繁に使用され、通常は非常に高品質で学習できます(ただし、一部は非常に高密度です)。

23
Alaric

Modern C++ Design 、Alexandrescuによる素晴らしい本とデザインパターンフレームワーク。警告の言葉、この本を読んだ後、私はC++をやめ、「一体、もっと良い言語を選んで無料で入手できる」と考えました。

12
Florian Bösch

思い浮かぶ2つの良い本は次のとおりです。

  • Modern C++ Design/Andrei Alexandrescu(名前にもかかわらず実際には7歳です!)
  • C++テンプレート:完全ガイド/ Vandevoorde&Josuttis

これは非常に詳細な分野なので、これらのいずれかのような優れた本は、ウェブサイトで間違いなく推奨されています。より高度なテクニックのいくつかは、しばらくの間コードを調べて、それらがどのように機能するかを理解する必要があります!

6
Nik

多くの経験を持つ人のリストは限られているため、本の大きなリストはありません。テンプレートメタプログラミングは、2000年に最初のC++テンプレートプログラミングワークショップを中心に本格的に開始され、これまでに挙げられた多くの著者が参加しました。 (IIRC、Andreiはしませんでした。)これらの先駆者はこの分野に大きな影響を与え、基本的には書かれるべきことが書かれています。個人的には、Vandevoorde&Josuttisにアドバイスします。 Alexandrescu'sは、この分野に慣れていない人にとっては難しい本です。

5
MSalters

Modern C++ は、私が読んだ中で最も優れた紹介の1つです。テンプレートのメタプログラミングの実際の有用な例をカバーしています。また、コンパニオンライブラリ Loki もご覧ください。

5
Eclipse

google Alexandrescu、Modern C++ Design:Generic Programming and Design Patterns Applied

4
Maxim Ananyev

Veldhuizenのオリジナルの論文は良かった。本全体を読みたい場合は、Vandevoordeの本「C++ Templates Complete Guide」があります。そして、修士課程の準備ができたら、AlexandrescuのModern C++ Designを試してください。

4
eduffy