Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ Template Metaprogramming - Is it possible to output the generated code?

I would like to debug some templated code to understand it better.
Unfortunately I'm new to template metaprogramming and it IS hard for me to get in.

When I try to output the preprocessed source files I get 125 000 lines of code :/

So is there a way I can see the generated Code? (The library I'm using is SeqAn)

like image 490
n00ki3 Avatar asked Aug 02 '09 14:08

n00ki3


People also ask

What is the point of template metaprogramming?

Template metaprogramming (TMP) is a metaprogramming technique in which templates are used by a compiler to generate temporary source code, which is merged by the compiler with the rest of the source code and then compiled.

What is the use of metaprogramming?

Metaprogramming is a programming technique in which computer programs have the ability to treat other programs as their data. It means that a program can be designed to read, generate, analyze or transform other programs, and even modify itself while running.

Does template support generic programming?

Generic programming is a key paradigm for developing reusable software components. The inherent support for generic constructs is therefore important in programming languages. As for C++, the generic construct, templates, has been supported since the language was first released.

How is C++ template compiled?

Template compilation requires the C++ compiler to do more than traditional UNIX compilers have done. The C++ compiler must generate object code for template instances on an as-needed basis. It might share template instances among separate compilations using a template repository.


1 Answers

Nope, in general, it can't be done. Templates are simply part of the C++ language, they're not a separate preprocessor, so they don't generate C++ code.

The usual solution is to sprinkle your code with static asserts and other tests to verify that the right templates get instantiated in the right ways.

Once you start getting lost in your metaprogramming, this simple trick can help you determine which type a template parameter really is:

// given a variable t of an unknown type T int*** i = t; 

When the compiler encounters this, it'll print out a nice and simple error message, "Can not convert <long, detailed typename> to int***", allowing you to easily verify that the template parameter T is actually the type you think it should be.

like image 76
jalf Avatar answered Oct 16 '22 07:10

jalf