Skip to main content

Templates and how to fold them

Variadic templates appeared in C++11 to cover such cases when you would have a template functions that could have a numerous members of different types. Doesn't it remind you of variadic functions that uses va_start, va_arg, va_end and so others? Cause it should be.

What would you like to do - write a bunch of specified functions for each type in order to cover all cases of it's usage. Many of pre 11 standard projects that have to deal with basic types provides such interfaces that provides you with overloaded versions of single function. In a UI library I'm using on my current project there is a logging class that provides a string formatting function that has 31 overloaded versions. Is there such a case where someone would need to pass 32 parameters into it? I don't even want to know.

The most popular example of variadic templates I can imagine is a std::tuple about which I've previously wrote a post.

Let's get back to the topic. Templates are used widely across STL and boost libraries. I'm pretty sure the maintainers of some features and libraries has applied variadic templates into their projects pretty already.

Here we have a couple functions that do a lot of work being relatively simple and self-explanatory at the same time.

tprintf is a variation of printf family functions but with a one major difference. Using the function you don't need to specify types of variables you would like to pass into printing function. By the way this printing function is really slow because of cout usage in general. cout has to deduce all the types of passed parameters when printf could just run predefined allocator for a variable that has been defined in a format string. Let's say complexity it that way - complexity of cout is way higher which means that it takes more time to run defined version of operator<< for each variable, convert it into string and put it into a output cache before flushing it. By the way I've spent so much of your time cause this example I've got from while I was struggling with installing gcc-7 on my a bit old version of kubuntu.

So, there is another sample function add which takes numerous variables and add them together into big and nice variable. Basically it depends on variables and their operator+ that's why I choose string. The code is pretty simple but there is a couple issues you can face while trying it by yourself. Folding part of typename has to be at the end of template definition list, other way it won't work.

I was trying to write a bit more complex example and got into SFINAE and it's magic, but I failed miserably and decided to write a post on SFINAE exclusively a bit later. So stay tuned!

Popular posts from this blog

OpenGL: how to start studying?

I've been studying OpenGL for about 2 years, but I haven't got far with it and had no idea what is wrong. Is it me unable to understand OpenGL abstractions or is it designed not very well? I was looking for an answer all these years when suddenly I've started getting into math since my job required some math skills and suddenly OpenGL started to make sense for me. I ain't trying to say that now it's fun and games - honestly I find it challenging, but not as bad as before.

Embrace the changes

“Change is the law of life. And those who look only to the past or present are certain to miss the future.” —John F. Kennedy I want to write a couple things on changes that happen all the time and which we don't notice or choose to do so. Not sure what they teach children in your country but in Belarus of 90-00s there was not much interest in a child that had some interests in topic that was out of school programs. And it made me into self-harming youngster who didn't know what to do and where to go. For some times I felt like there were no changes around me, which was faulty way of thinking. So that approach rooted in me until I've got into a University. People there had a lot of interests so different of mine that all first year I've been stunned. It was so hard for me to get it - people, that have will, do embrace changes and adapt to it to go further with their plans.

What was so alien for me back then, became a most important force in my life now. To be able to mo…

Tuples: are they useful?

In some languages there is such a thing as tuple which makes real to write such code (this time it's in python):

def f(x):
 # do stuff return (True, modified_string)

success, modified_string = f(something) 
C++ hadn't such feature until C++11. That was one of the reasons to pass variable as referenced argument, which ended up creating huge code bases that have unused arguments in it's functions. That happened in order to save revers compatibility and allow clients to use stable interfaces to access libraries without checking the version of dynamically attached library in order to use correct functions.