C ++テンプレートメタプログラミングのベストイントロダクション?[閉まっている]


112

静的メタプログラミング(別名「テンプレートメタプログラミング」)は、コンパイル時にプログラムを実行できる優れた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 ++静的メタプログラミングについてもっと学びたい場合、最良のソース(本、ウェブサイト、オンラインコースウェアなど)は何ですか?


43
電球が「オフ」または「オン」になりましたか?
horseyguy

36
オフ。間違いなくオフ。
Thomas Eding 2012

回答:


108

[自分の質問に答える]

これまでに見つけた最高の紹介は、Krzysztof CzarneckiとUlrich W. Eiseneckerによるジェネレーティブプログラミング、メソッド、ツール、およびアプリケーションの第10章「C ++での静的メタプログラミング」です。ISBN-13:9780201309775; C ++テンプレートの第17章「メタプログラム」: David VandevoorderとNicolai M. Josuttisによる完全なガイド、ISBN-13:9780201734843。

代替テキスト 代替テキスト 代替テキスト 代替テキスト

Todd Veldhuizenには、優れたチュートリアルがあります

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

私が見つけた最高の中間/高度なリソースは、David AbrahamsとAleksey GurtovoyによるC ++テンプレートメタプログラミング、ISBN-13:9780321227256です。

本を1冊だけ希望する場合は、「C ++テンプレート:完全ガイド」を入手してください。これは、一般的なテンプレートの最も信頼できるリファレンスでもあるためです。


2
Todd Veldhuizenの作品へのリンクが古くなっています。
John R. Strohm


1
リンクを修正しました、ありがとう!
jwfearn 2013

リンクが再び壊れました!
Paul

1
@jwfearnに感謝します。記事を読みましたが、こちらの方が面白いと思いました:youtube.com/watch ?v=Am2is2QCvxY (2つの部分に分かれています)。Walter E. Brownによる講演です:Modern Template Metaprogramming:A Compendium
Paul

24

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

言及する価値があるのは、Boostライブラリーです。これらのライブラリーは、これらの技法を頻繁に使用し、通常、非常に高品質で学習できます(ただし、かなり密度が高いものもあります)。


12

Alexandrescuによる見事な本とデザインパターンフレームワークであるModern C ++ Design。警告の言葉、この本を読んだ後、私はC ++をやめ、「なんと言っても、もっと良い言語を選んで無料で手に入れることができる」と思いました。


5
「一体、もっと良い言語を選んで無料で手に入れることができます」うーん、どういう意味ですか?「無料」には特に戸惑います。そして、他にどんな言語を考えていましたか?
ポップカタリン

12
C ++テンプレートメタプログラミングは、型や型のリストを引数として渡すなど、あらゆる種類の新しい機能を提供します。これらの機能のほとんどは、Pythonのような動的に型付けされた言語にあり、構文が優れています。
フロリアンボッシュ

1
正しいプログラムをすばやく作成できる言語を探しているなら、PythonはC ++よりも優れています。C ++が提供する他のものが必要な場合は、C ++にLispのような機能を追加する方が、別の言語をC ++化しようとするよりも良いかもしれません。
David Thornley、

6

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

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

これは非常に詳細なフィールドであるため、これらのような優れた本は、ウェブサイトでは絶対にお勧めです。より高度なテクニックのいくつかは、コードを研究して、それらがどのように機能するかを理解するようにします。



5

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


4

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.