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

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...

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...

Fun with Lambdas: C++14 Style (part 1)

It's common knowledge that Functional Programming is spreading like a wildfire in mainstream languages. Latest promoted languages: Java 8 and C++, both of which now support lambdas. So, let the lambdas begin! and may the fun be ever on your side. The same text is available in slides form on Slideshare . This blog post and the talk/slides are inspired by JSON inventor  Douglas Crockford . Write an Identity function that takes an argument and returns the same argument . auto Identity = [](auto x) { return x; }; Identity(3); // 3 Write 3 functions add, sub, and mul that take 2 parameters each and return their sum, difference, and product respectively. auto add = [](auto x, auto y) { return x + y; }; auto sub = [](auto x, auto y) { return x - y; }; int mul (int x, int y) { return x * y; }; Write a function, identityf, that takes an argument and returns an inner class object that returns that argument . auto identityf = [](auto x) { class Inner { int x; publi...