Skip to main content

The video of New Tools for a More Functional C++

My previous talk on New Tools for a More Functional C++ ran into some audio issue during the meetup. I did not upload the video back then because it had no audio what-so-ever. I finally got around to record the audio track for the talk and I mixed it with the video. So here is the final video. Have fun with FP in C++!

If you don't have 35 minutes, checkout the partial video transcripts below.

Functional Programming Tools in C++ from Sumant Tambe on Vimeo.

Video Transcripts

00:16
We’re going to talk about functional [programming] tools in C++ and what new capabilities exist in modern C++. 

2:00
I'm reviewing Functional Programming in C++ book by Manning---a good book for C++ programmers to acquire beginner to intermediate level knowledge of FP in C++.

2:30
Sum types and (pseudo) pattern matching in C++

5:00
Modeling a game of Tennis using std::variant

7:30
std::visit spews blood when you miss a case in the visitor. See an example. Therefore, language-supported pattern matching is much more preferable than library support for the same.

9:00
Passing overloaded lambdas to std::visit---the fancy way to create a visitor. User-defined deduction guides for overloading from lambdas.

13:00
Algorithms implemented using pattern matching style tend to concentrate the entire algorithm in a function as opposed to object-oriented programming style where the algorithm is spread in multiple classes and potentially multiple files.

15:00
Sharing state become much easier with inheritance as opposed to std::variant based decomposition.

18:05
Too much ceremony in std::variant approach as you have to call std::visit and pass a visitor to it. In object-oriented style, it is just a call to a function and hence it’s very succinct.

19:00
Recursive std::variant is not possible without recursive_variant. std::variant is a container not an abstraction. std::variant alone isn’t sufficient to implement algebraic data types or the Composite design pattern.

21:00
std::variant disables fluent interfaces.

22:00
A summary of differences between inheritance and std::variant –based modeling alternatives in C++.

23:00
Deep Immutability in C++. C++ const is shallow. A raw pointer does not forward const-ness, propagate_const does. You can now implement deep Immutability in C++ using propagate_const.

26:00
A class containing propagate_const is not copy-assignable. This is consistent with basic C++ rule that a pointer to const can’t be assigned to pointer to non-const.

27:30
Mutable temporaries in C++. Yes, temporaries can be modified. Modern C++ provides ways to control this. See why you may need std::move(*this);.

29:00
The Named Parameter Idiom---an example of fluent interface in C++. 

31:00
Avoid constructing unnecessary temporary objects when fluent interfaces are used with immutable objects.

33:45
How to disambiguate between r-value reference qualified functions and l-value reference qualified functions. *this in a r-value qualified function is a l-value. The trick is to return a r-value reference to *this. Hence std::move(*this), which is a simply a cast.

35:00
Thank you!

Comments

Thanks for sharing, I appreciate you breaking it out into text to save time as well :). Very informative of the new C++ tools available and I look forward to future updates.

Popular Content

Multi-dimensional arrays in C++11

What new can be said about multi-dimensional arrays in C++? As it turns out, quite a bit! With the advent of C++11, we get new standard library class std::array. We also get new language features, such as template aliases and variadic templates. So I'll talk about interesting ways in which they come together. It all started with a simple question of how to define a multi-dimensional std::array. It is a great example of deceptively simple things. Are the following the two arrays identical except that one is native and the other one is std::array? int native[3][4]; std::array<std::array<int, 3>, 4> arr; No! They are not. In fact, arr is more like an int[4][3]. Note the difference in the array subscripts. The native array is an array of 3 elements where every element is itself an array of 4 integers. 3 rows and 4 columns. If you want a std::array with the same layout, what you really need is: std::array<std::array<int, 4>, 3> arr; That's quite annoying for...

Review of Manning's Functional Programming in C++

Last year I reviewed the pre-print manuscript of Manning's Functional Programming in C++ written by Ivan Čukić. I really enjoyed reading the book. I enthusiastically support that the book Offers precise, easy-to-understand, and engaging explanations of functional concepts. Who is this book for This book expects a reasonable working knowledge of C++, its modern syntax, and semantics from the readers. Therefore, reading this book might require a companion book for C++ beginners. I think that’s fair because FP is an advanced topic. C++ is getting more and more powerful day by day. While there are many FP topics that could be discussed in such a book, I like the practicality of the topics selected in this book. Here's the table of contents at a glance. This is a solid coverage of functional programming concepts to get a determined programmer going from zero-to-sixty in a matter of weeks. Others have shared their thoughts on this book as well. See Rangarajan Krishnamo...

Want speed? Use constexpr meta-programming!

It's official: C++11 has two meta-programming languages embedded in it! One is based on templates and other one using constexpr . Templates have been extensively used for meta-programming in C++03. C++11 now gives you one more option of writing compile-time meta-programs using constexpr . The capabilities differ, however. The meta-programming language that uses templates was discovered accidently and since then countless techniques have been developed. It is a pure functional language which allows you to manipulate compile-time integral literals and types but not floating point literals. Most people find the syntax of template meta-programming quite abominable because meta-functions must be implemented as structures and nested typedefs. Compile-time performance is also a pain point for this language feature. The generalized constant expressions (constexpr for short) feature allows C++11 compiler to peek into the implementation of a function (even classes) and perform optimization...