c++ - 言語 - プログラミング テンプレート




C++のテンプレートメタプログラミング-生成されたコードを出力することは可能ですか? (4)

私はそれをよりよく理解するために、いくつかのテンプレートコードをデバッグしたいと思います。
残念ながら、私はメタプログラミングのテンプレートを初めて使いました。

前処理されたソースファイルを出力しようとすると、125 000行のコードが得られます。/

だから、私は生成されたコードを見ることができる方法はありますか? (私が使っているライブラリはSeqAn


C ++のテンプレートメタプログラムのデバッグに関する私の出版物をチェックする

6ページから、どのように動作するかを見ることができます。 特定の目的のためには、ツールチェーン全体を必要とせず、手作業で行うことができます。

ブレークポイントなどを置くことができるVisual C ++アドインをまとめましたが、それは毎日の使用のためのツールよりもむしろ概念の証明でした。

私たちはすべてのインスタンス化を表示し、デバッグとプロファイリングを可能にするグラフィカルなフロントエンドに取り組んでいます。 残念ながら、私たちは非常に限られたフリータイムでそれを行うので、そのツールの公開日を約束することはできません。

アップデート: hereデバッガとプロファイラを利用できhere

UPDATE: C ++ Nowプレゼンテーション


いいえ、そうではありません。 プリプロセッサは、コンパイラによって実行されるテンプレート処理とは何の関係もありません。 テンプレートはC ++コードを生成しません。関数呼び出し以外にも、C ++言語自体の不可欠な部分です。


これは潜在的にあなたの質問に対する答えです:

C ++テンプレートプリプロセッサツール

最後に尋ねた人に満足しているように思えますが、なぜ私は想像できません! C言語でのC ++コンパイラの出力は、理解の助けになるものではなく、単に移植可能なアセンブリ言語の一種であるため、通常はかなり読めません。


一般的にコード全体を出力することはできません。 しかし、私が非常に面白いと分かったのは、Visual C ++デバッガを使用してそのタイプを表示できることです。 その単純なメタプログラムを取ってください:

template<class Head, class Tail>
struct type_list
{
  typedef Head head;
  typedef Tail tail;
};

struct null_type
{};

template<class List>
struct list_head
{
  typedef typename List::head head;
};

template<class List>
struct list_tail
{
  typedef typename List::tail tail;
};

template<class List>
struct list_length
{
  static const size_t length = 1+list_length< typename list_tail<List>::tail >::length;
};

template<>
struct list_length<null_type>
{
  static const size_t length = 0;
};


int main()
{
  typedef 
    type_list
    < int
    , type_list
      < double
      , type_list
        < char
        , null_type
        >
      >
    >       my_types;

  my_types test1;

  size_t length=list_length<my_types>::length;

  list_head<list_tail<list_tail<my_types>::tail>::tail>::head test2;

}

私はちょうど私のメタタイプをインスタンス化しました。 これらは少なくとも1バイト長の空のC ++クラスインスタンスです。 今、私はtest2の最後のインスタンス化の後にブレークポイントを置くことができ、どのタイプ/値の長さ、test1とtest2があるかを見ることができます:

デバッガの表示内容は次のとおりです。

length  3   unsigned int
test1   {...}   type_list<int,type_list<double,type_list<char,null_type> > >
test2   -52 'Ì' char

今あなたは頭部があなたにキャラクターを返したことを知っています、あなたのリストはint、double、charを含み、null_typeで終わります。

それは私をたくさん助けました。 時には、本当に面倒な型をテキストエディタにコピーし、それを読みやすい形式に整形する必要があるかもしれませんが、内部のものと計算方法をトレースする可能性があります。

希望は、
Ovanes





seqan