CppCast - Boost Application Development
Episode Date: January 4, 2018Rob and Jason are joined by Antony Palukhin to talk about some of the Boost libraries he's contributed to including Any, Conversion, DLL, LexicalCast, Stacktrace, TypeTraits and Variant; as well as hi...s Boost Application Development book. Antony Polukhin was born in Russia. Since university days he started contributing to Boost and became a maintainer of the Boost.LexicalCast library. Today, he works for Yandex, helps Russian speaking people with C++ standardization proposals, consults Russian companies in C++, continues to contribute to the open source and to the C++ language in general. You may find his code in Boost libraries such as Any, Conversion, DLL, LexicalCast, Stacktrace, TypeTraits, Variant, and others. News Clang Running in Browser (Web Assembly) Kate Gregory - It's Complicated - Meeting C++ 2017 Keynote Speeding up the Build of C and C++ Projects C++17 constexpr everything (or as much as the compiler can) Antony Polukhin Antony Polukhin's GitHub Antony Polukhin's Blog Links Boost C++ Application Development Cookbook Boost C++ Libraries StdCppRu Telegram C++ Channel Sponsors Undo Embo++ Hosts @robwirving @lefticus
Transcript
Discussion (0)
Episode 132 of CppCast with guest Anton Palukin recorded January 3rd, 2018.
This episode of CppCast is sponsored by Undo.
Debugging C++ is hard, which is why Undo's technology is proven to reduce debugging time by up to two-thirds.
Memory corruptions, resource leaks, race conditions, and logic errors can now be fixed quickly and easily. So visit undo.io to find out how its next-generation debugging technology can help you find and
fix your bugs in minutes, not weeks.
CppCast is also sponsored by Embo++.
The upcoming conference will be held in Bochum, Germany from March 9th to 11th.
Meet other embedded systems developers working on microcontrollers, alternative kernels,
and highly customizable zero-cost library designs.
Get your ticket today at embo.io.
In this episode, we talk about speeding up your build
and constexpring everything.
Then we talk to Anton Palukin, author and maintainer of several boost libraries.
Anton talks to us about some of hisppCast, the only podcast for C++ developers by C++ developers.
I'm your host, Rob Irving, joined by my co-host, Jason Turner.
Jason, happy 2018.
Oh, you know what?
It's 2018 and I still don't have my flying car.
That's all I can say.
Yeah, starting with a little bit of disappointment, I guess.
But, yeah, hopefully it'll be a good year.
2017 was pretty good overall, especially for the podcast. It hit 100 episodes.
Right.
Plenty to look forward to.
Do you do anything particularly exciting
for the new year? No.
My main goal with all the travel I've been doing lately
was to stay at home doing nothing for the
holidays, which I mostly succeeded
at doing.
Yeah, I have kids, so
we don't ever stay up for new year's anymore until they're
a little bit older i guess but uh but we had a good time yeah okay well on top of our episode
i'd like to read a piece of feedback uh we got a lot of tweets over the past few weeks while we
were off uh this one was from rodrigo rodrigo montero and he writes, and now for a change from just having videos and articles
on this thread, a podcast,
CppCast is an excellent way to keep
up with modern C++, which should be highly
relevant to many game programmers.
And this was at the end of a thread where he
was suggesting, I guess, lots of YouTube
videos and other resources game
programmers can use to learn
more about their trade, and it was
nice for him to recommend the podcast
too. Yeah, that's cool.
Yeah. Well, we'd love to hear
your thoughts about the show. You can always
reach out to us on Facebook, Twitter, or
email us at feedback at cpcast.com
and don't forget to leave us a review
on iTunes.
Joining us today is Anton Palukin.
Anton was born in Russia. Since
university days, he started contributing to Boost
and became a maintainer of the Boost lexical cast library.
Today, he works for Yandex, helps Russian-speaking people with C++ standardization proposals,
consults Russian companies in C++,
and continues to contribute to the open source and to the C++ language in general.
You may find his code in Boost libraries such as Any, Conversion, DLL,
LexicalCast, Stack Choice, Type Traits, Variant, and others. Anton, welcome to the show.
Thank you. So LexicalCast is the one where you can just like cast anything to a string,
basically. Is that right? Yeah, and you can cast a string or pointer to characters to
anything you like, any numbers.
Okay. How did you get started maintaining that?
Oh, accidentally.
I was kind of bored on my first walk, and I started gazing at the source codes of the Boost libraries,
and finally I found a place in LexicalCast that could be done better.
After a few weeks, there was a patch, the maintainer accepted it,
and after a few months, I was nominated to be a maintainer of the Boost LexicalCast.
So are you still the maintainer of the Boost lexical cast. So are you still the maintainer of it?
Yeah, of it and of many
other libraries like any
on the Boost variant.
Okay.
How long have you been
involved with Boost now?
About five years or
even more. Okay.
Cool. Okay, well, Anton, we
have a couple news articles to discuss.
Feel free to comment on any of these,
and then we'll start talking more about some of your contributions to Boost
and some of your other work, okay?
Okay.
Okay, so this first one is a GitHub repository
for running Clang in your browser.
And this is pretty impressive uh it brings in script in in and and compiles clang
using it or web assembly and then you can compile some code and actually execute it in your browser
it's uh it's pretty amazing right jason yeah so clang compiled into web assembly then running in
the browser and then from there you can compile things into WebAssembly.
I don't know if there's a practical use here, but...
Yeah, now you can compile your code even longer.
It does take some time to compile Clang in order to compile any other program,
but it's pretty cool for a demo.
Actually, this feature is kind of really nice for teaching
because it takes a lot of time to set up your compiler,
your standard library, your IDE to teach people how to
write, make files or something like this.
But with this feature, all you need is a student, a browser,
and the Hello World.
Right.
Unfortunately, that stuff on GitHub cannot compile Hello World
because it doesn't work with std cout and other global variables.
Right.
Okay.
I was wondering about that when I saw in the demo that they're using puts,
which I have no problem with for a simple demo here,
but I,
I,
I wondered about the decision.
I didn't see that that was the problem.
Oh,
okay.
Uh,
next one,
we have,
uh,
one of Kate Gregory's talks is her meeting C++ keynote,
which I didn't have a chance to watch.
I meant to watch it this morning,
just ran out of time before we got ready for the show,
but it looks like all the meetings C++ videos are now online, right, Jason?
Oh, I don't think all of them are up yet.
No? Okay.
Because I didn't think any of mine were up yet.
Okay, well, it looks like the Meeting C++ keynotes are out.
I guess they're still working on some of the other videos.
Yeah, the keynotes are definitely out.
Now I'm curious which ones from 2017 are up.
Well, anyhow.
Yeah, I think Jens is still working on it,
but they are coming up for sure.
Did you have a chance to attend Kate's keynote?
I attended, I believe, about half of it.
Yes, and it looks like there's 10 videos
from Meeting C++ 2017 up right now but yeah it
was good um the part that i saw was definitely good and you might notice that the keynote length
is two hours for that video yeah jens has meeting c++ has the uh the longest keynotes i believe of
any conference that i'm aware of very good, I'll definitely have to watch that one.
Anton, did you have a chance to watch any of the Meeting C++ keynotes?
I've just watched a few of them. And I'd like to say that Kate Gregory is awesome.
She's really great.
And she helped some of my friends even without knowing that.
Some of my friends were writing courses for
C++ beginners.
And they've got a pack of about five people.
They started to develop the C++ course.
And, well, the first versions were really bad. They've got pointers all around the course.
They were teaching people new, to call new, and delete in the first week.
And then the leader of the course, he saw the Gates talk about how to teach modern C++.
After that, those guys rewrite all the course.
They've just changed it totally.
And now it's really awesome course for the beginners.
It's one of the most popular courses on Coursera.
And it's just awesome.
I know that they would like to say thank you, Gregor.
And this show is a perfect place to say that thank you kate
um uh that's excellent i'm sure she appreciates that and if yeah if you teach her her talk stop
teaching c really makes you think like how should we approach teaching modern c++ to people. And yeah. Yeah, absolutely.
Great talk.
Okay, this next one is another article from PVS Studio.
These ones are always really well written.
And this one is about speeding up the build of C, C++ projects.
And I don't know about you guys, but I learned at least one new thing here.
This article kind of goes in a lot of different directions.
It talks about Unity builds and compiler cache, distributed compilation.
But when they're talking about forward declarations,
I knew that you could forward declare a class and then use it as
a pointer. But I didn't know
you could do a const reference and do that with only a forward declaration.
I knew you could do like a const reference and do that with only a forward declaration i knew you could do with the const reference but i think he also says if it's a return value yeah that too that
surprised me yeah if you have a return value and then you can get away with just a forward
declaration instead of including the header file that declares that class. I need to spend some time looking at that.
Yeah.
Anything else either of you wanted to highlight with these articles?
This article?
I just know the guys that
are developing
this stuff and guys from
PVS Studio. I just
meet them at
some of the Russian meetings.
They're always awesome.
They tell wonderful stories.
And they have a really good tool for static analysis of C++ code.
Since you mentioned the Russian C++ community,
I've heard that it's quite large. like at your meetings and your local conferences, you get a lot of people. Is that correct? thousand of attenders on the big conferences we've got small group meetings there's there's about
100 people and we've got a set of chats in different uh well it's called telegram it's kind of skype but for russia okay and there is a channel where there are 2,000 professional programmers
and a lot of programmers that just start their path with C++.
So the community, yes, is kind of big and interesting.
So there's a conference coming up soon in Russia, right?
Yeah, there's a conference in St. Petersburg.
You're welcome to join.
Okay.
By the way, it's really warm now in Moscow and in Petersburg.
We've got 5 degrees by Celsius outside. It's about 30
degrees warmer than usual. Yeah, that sounds really warm, yeah. We've got no snow. Wow.
It looks like it's summer, not winter. Oh, wow. That is not what you think of for January in Russia. Yeah. Yeah, it's going to be warm here.
Wow.
In Petersburg.
So, come on, join.
That is going to be fun.
How long has that conference been going on?
Because, you know, the CPPCon conference is still relatively new.
It's third or fourth year now, Jason?
CPPCon may be fifth year, but it was merged from a couple of other conferences.
Right.
How long have the Russian C++ conferences been around?
I've been participating in the first conferences, and that was about four years ago.
Okay.
Okay.
And then this last article we have, Jason, you want to introduce this one about C++17 and constexpr, everything?
Yeah, I just wanted to mention this, the Reddit discussion specifically,
because you have a lot of interesting conversation from Gabby and STL and other people that we recognize
about the history of constexpr and where it originally came
from and some of the discussion and we've heard I've heard other people involved in the C++
committee talk about this how anytime there's some new feature in the language everyone insists on
it being very verbose so we need a new. We need constexpr or whatever the keyword is.
But then after a few years of using it, everyone says, well, why does the syntax have to be so
verbose? We really want. But anyhow, so there's just a, it's a great amount of conversation on
the Reddit discussion specifically about the history of constexpr. So I thought I'd mention it.
Okay. Well, Anton, why don't you tell us a little bit about Boost DLL
and what the purpose of that Boost library is?
Oh, actually, it's kind of a small and simple library.
Actually, it was part of the Boost application library,
and the author of that library, Renato, if I remember correctly, he proposed that library for Boost Review.
The library wasn't ready, but there was a really interesting component for working with plugins.
I've talked to that guy, Renato, and we've forked the Boost application. Now it's Boost DLL.
We've removed all except the dynamic library loading stuff, added more classes
and here it comes. Here it is at the Boost DLL library that simplifies your work
with plugins. Mostly it's a wrapper around system calls like deal
open and load library and some utility stuff to gaze inside the plugin and find
out symbols that are exported from the plugin sections that are in the plugin
and other stuff. Oh and by the the way, the core part of the Boost
DLL library is the shared library class that does a DL open and DL close. It is proposed for
inclusion into the C++ standard. So hopefully we'll see it in C++ 20 or 23 or 26. You get the pattern.
So,
just let me clarify.
Boost DLL, the point is for loading plugins
effectively, shared libraries, dynamically
choosing to load them, right?
Yes. And you're saying that
the functionality of that has been proposed for C++?
Yes.
And what has been the feedback so far from the standards
community?
The standards committee doesn't like shared objects.
No, I'm sure they don't.
So there's been about four or five iterations
of the proposal.
It becomes smaller and smaller,
less functionality in there,
but it becomes more beautiful, more strict, more kind of nice.
Okay.
For anyone who's ever had to do this before,
there's so much boilerplate that you have to do for each operating system,
and having a standard way of doing it would be very handy.
Yeah, there's a really nice thing that I like most
of them, that I
really like, is the ability
to pass a flag
please apply platform-specific
decorations to the
path to the library.
So you can write
I don't know
my library and on Windows
that will be my libraryibrary.dll.
On Linux, this would be leapmylibrary.so, and so forth on different platforms.
That's my favorite part of the library.
Yeah, it's frustrating if you do something like write a C library or C++ library
that can be loaded by Python,
and then the Python module loader system
expects.so on Windows.
And that kind of thing changes between releases.
It's the kind of thing I've had to chase down a few times
in the work that I do.
So yes, having a do the smart thing
and load the right thing sounds great.
You mentioned that this was derived from the Boost application library,
which didn't make it into Boost.
Is that still being worked on, though?
I'm not really sure.
I know that there are really nice parts in that library,
like call to make a demon on Linux and service
on Windows
function to do that
in a cross-platform manner.
But that's
all I know about boost application.
Okay.
We talked earlier about
in your bio about some of the other boost libraries
you worked on. Do you want to talk
a little bit more about some of these other ones
that we haven't discussed before in the show?
How about Boost Stacktrace?
Oh, that's kind of a new library.
And mostly it's for debugging purposes.
So you can say Boost Stacktrace variable,
and that variable will hold the current Stack stack trace. You can put it into the
exception, you can print it to the stutcout or whatever you like and it will decode the
stack showing function names, location of the function in the source code and so forth.
You can see such things in C-sharp language or in Java when you've got an exception, it prints a pretty stack trace
and that's it.
That's the Boost Stack Trace library.
And by the way, that library also will be proposed
to the C++ standardization committee someday.
That's an interesting one, because on Java and C Sharp,
you've got a virtual machine where it seems a little bit more obvious
how you would have access to the stack.
So what do you do in C++ to actually generate your stack?
Mostly all the compilers have intrinsics for generating
the stack, like GCC and Clang have specific system library calls for
collecting the stack and they use those calls for exception handling and
stack unwinding. On Windows, it's a nightmare.
You don't want to know what's happening in there.
But it involves COM, common object mode.
Last time I worked with COM, I was working with Visual Basic 6.
Good for you.
What are some of these other libraries?
Boost.any, Boost.conversion?
Boost.any and Boost.conversion are not my libraries.
They were developed by other people, and I just maintain them,
just keep an eye on them to update tests, fix warnings, update docs.
That's mostly it. That's it.
Okay.
Same story with Boost Variant, but now there's a lot of people who want to make Boost Variant faster and better,
and they propose different nice features for the Boost variant.
Boost variant took a different design path than standard variant, right?
Yes, and it's really great to see that the standard variant took different paths.
Okay. There are dark corners in the Boost variant that you do not want to use.
Like there is a recursive boost variant.
You can make a recursive boost variant.
So it's a boost variant that contains itself within itself.
Right.
It involves a template metaprogramming hell, it
involves, if I'm not mistaken, a few undefined behaviors, and it involves a
few sub-optimal things like that recursive wrapper is actually a thing that cannot
hold null pointer.
So when you move it, it actually
does dynamic allocation
and copy constructs the
other stuff.
Well,
it makes sense that they would have to for
a recursive thing like that, but
to bake in dynamic allocation into
something like variant, which to bake in dynamic allocation into something like Variant, which
shouldn't do dynamic allocation
because it can know the size ahead of time
is, yeah, that seems less than
ideal.
I really like the path that
the standard team 80 took.
It's more obvious
and simpler to implement.
I wanted to interrupt
this discussion for just a moment to bring you a word from our
sponsors. You have an extensive
test suite, right? You're using TDD,
continuous integration, and other best practices.
But do all of your tests pass
all the time? Getting to the bottom of
intermittent and obscure test failures
is crucial if you want to get the full value from
these practices. And Undo's live
recorder technology allows you to easily fix
the bugs that don't
otherwise get fixed capture recordings of failing tests in your test suites and debug them offline
so that you can collaborate with your development team and customers get your software out of
development and into production much more quickly and be confident that is of higher quality visit
undo.io to see how they can help you find out exactly what your software really did as opposed to what you expected it to do and fix your bugs in minutes, not weeks.
In addition to all the Boost libraries,
you also are the author of the Boost C++ Application Development Cookbook.
And that just had a second edition release, right?
Do you want to tell us a bit about the book?
Well, it's a good book.
Actually, it was my lucky day that this book appeared. I was really active at the Boost
mailing list and the publishing agency was searching for a guy, for a person who could write a book for them.
They got the great idea that Boost Libraries is just a list of libraries.
If you've got some trouble, some problem that you wish to solve,
you can map your problem to a library.
You have to read through all the libraries and then find out the matching one.
It's linear search.
So, for example, if you get a problem, you need to parse date time.
You just cannot figure out that you need a Boost Spirit or Boost Regex
without reading through all the libraries in the Boost docs.
Right.
And that's the idea of the book. It has some typical problems
and answers how to solve that problem using Boost. And a bunch of comments how to do it faster,
how would that solution look in C++ 17, C++ 14, how it would look with C++20 or Networking TS, and so forth.
So the book is published in English, I assume?
Yes.
I'm curious if you have a Russian version of it also.
No, I don't have.
Okay.
Yeah.
I've talked to several non-native english speakers who just don't like
reading technical books that have been translated they want to read the original english version
because it's less likely to have mistakes i've been told and but i figured if you are the russian
author then you probably wouldn't have mistakes in your Russian version of your own book.
Yeah, that's true, but there is a confusion
when you translate
C++ technical book to
Russian because of
earlier bad
translation in
19th years.
There is a big
confusion in the
technical books.
For example, operators and expression in Russian language, if you translate them, they're switched.
So if you read expression in English, it's actually translated to Russian as operator.
Yeah, that blows your mind. translated to Russian as operator. Huh.
Yeah, that blows your mind.
So you're saying, you know, like earlier Russian technical books had this mistake?
Yeah, and that mistake just was split all around the books, all around the technical stuff. So now when you translate operator, you must write
in Russian word for expression. When you translate English word expression, you have to write
Russian word for operator. That's awful. And there's a lot of such cases.
Okay. Do most Russian C++ developers learn with English books, or do they learn with these Russian books that have these mistakes?
Well, usually you start with Russian books, and then you go to the English literature, and it blows your mind.
I imagine it would.
Okay.
Have you gotten a lot of good feedback about the book?
Has it done well?
Yeah, I've got a lot of good feedback for the first book.
And the second edition, it just came out,
and there's not much feedback yet.
It's good to see that you are continuing to update it, though. I feel like a lot of books basically get abandoned, and so it's good to see that you're doing multiple editions of it and
updating it. Oh, yes. All the source codes are available at GitHub. Also, there is a website
that allows to compile the examples from the book online, to modify them and compile online, and to run them.
So I think it's a good way to start playing around with Boost.
Jason, did you want to ask about some constexprification?
Yeah, so Anton, in an earlier email, you said that you had been working on
better application of constexpr through the standard library.
What have you been involved with?
My first proposal to the C++ committee was about adding constexpr to array, move iterator,
reverse iterator, helper functions like begin, advance, next.
And that paper was accepted into the C++17.
Okay.
That was an easy start.
Then it gets worse.
Second paper was about adding constexpr to the algorithm header,
and it didn't make it into the C++17.
Half of the paper made it into C++20.
I do hope that the remaining part of the paper will also make it to the C++20 on the next meeting.
And there's a lot of other places where constexpr must be added. By the way, I've got some enthusiasts that are working on the remaining parts of standard library
on adding constexpr, and Jason, your talk about constexpr, everything really helped us.
We didn't note it, for example, that stdquare missing constexpr in a few places.
Yeah, right.
Excuse me.
So since you said that you wrote the original paper on applying constexpr to array,
I have to ask, because I've had this question for like a year now.
Why does standard array fill member function?
Why is that not constexpr? The standard, the fill
member function and functions for comparisons of array are not
constexpr because they rely on the std algorithm function being constexpr.
Okay. So first I have to, first the paper on making all the algorithm constexpr. So first I have to first the paper on making all the algorithm constexpr must be accepted
and only after that we can make std array more constexpr.
Okay, that answers a long-standing
question for me. Thank you.
Jason, what else we got?
So you also said that you're working on the ability to move sub-objects out from, for example, like a pair or a tuple.
Is that correct?
Yeah, that's correct. I've got a paper on allowing more optimizations for the compiler, mostly for making copy and move illusion for sub-objects.
That's the short story. The long story is following.
Once upon a midnight rary, I was gazing at this this assembly and here's what I saw in there. There's been some object A and there's been a lot of work with that
object A. Some member functions were called, some other stuff was done with
that object A. At some point object B was copy-constructed from A, and then A was immediately destroyed.
After that, all the work was done with object B.
Okay.
That was strange, because I wasn't implicitly writing or explicitly writing such code.
I wasn't copy-constructing that B object just out of thin air.
I started looking at my C++ code and find out that there is a function that defined in a header file and that has stood pair and returns the second element of the stood pair.
And that second element is object A.
And when that element is returned, it becomes an
object B. So object B is copy constructed from pair second. Right. At that point, I've just,
after a lot of thinking and discussing, I have understood that compiler sees that object B is
copy constructed and object A is destroyed. So the idea of the proposal is to allow
aligning copy and move constructors
for sub-objects after the inlining stage.
Is that clear?
Yes. Have you gotten any feedback
from anyone who works on compilers to see how plausible this is?
I've asked a few people, but I've asked them on 25th of December.
So no response yet.
Okay.
Actually, that paper has some kind of improvement. There is an ultimate copy
illusion paper, and the idea of the ultimate copy illusion is to allow the lighting copy
and move constructors, not just when we are returning some object, but always when there is a construction of some object and
immediate destruction of the source object.
So this covers the cases when we return a local variable by std move, when we
return a function argument without std move or with std move.
This covers the cases when we construct a class that holds a variable and we put in the arguments by const references,
a lot of things, when we return from std optional and so forth.
I really hope that this paper will be accepted
and the C++ code
will become two or three times
faster.
I can see that being huge.
One of the things that I've had conversations
with lately with several people was
like you said, returning
a local object
into an optional return value
and that has to be a copy or a move today.
There's no way to elide that.
But if we could give the compiler a way to say,
I like the wording that you're saying,
that if it's an object that is immediately destroyed,
then you know that its lifetime has ended
and you can elide the move or copy.
Sounds like it hasn't promised to me,
but I've never been on the standards committee or written any compilers.
So what else are you working on?
Do you have any talks coming up at these Russian C++ conferences?
Yeah, I often participate in Russian conferences,
and I've participated a few times in English-speaking conferences like in CPPCon.
I was describing the internals of the reflection library that works without macro and external tooling in C++14.
Right, I think I've seen that talk actually.
Do you have any upcoming talks?
Probably
in this year,
yes, but
I haven't thought about
them.
I hope to
participate
in one of the
C++ meetings somewhere in
Europe or somewhere in USA in this year,
but I'm not sure that it will happen.
There are some problems with getting visa in Russia for USA.
Right.
I believe the C++ Now call for submissions is still open, right?
So there's still that conference. And then CBPcon call for submissions is still open, right? So there's still that conference.
And then CppCon call
for submissions has not opened yet.
Yeah.
That should be sometime early spring, right?
Generally, around the time
that we're wrapping up C++
Now, it will end up putting
a call for CppCon.
I don't remember when the actual date is that it opens,
but that's how I look at it
Anton, do you have any other projects you want to share that we haven't gone over
like any other Boost libraries that you've been working on recently?
Probably not
I've got enough Boost libraries to keep an eye on
I'd like to say that for a year now
we've got a website for Russian-speaking people that helps people to put their thoughts together
and form that in the proposal for the C++ Standardization Committee.
So if you've got some ideas about how to improve C++ language,
you can write to that site.
It's stdcpp.ru.
And there, me and other people could help you with that.
That sounds great.
There are also some discussions of the ideas. There are
voting on the ideas.
So enjoy. You can
join. It's kind of fun.
Yeah, it sounds like a great
resource you're providing. Okay, well,
Anton, it's been great having you on the show today.
We'll put a link to
that website you were just discussing in the
show notes. And where can people find you
online?
I'm available
at
my link list
Boost mailing list, I'm available
at my personal email, you can
find that in
any paper that I wrote
for the C++ committee
I've got
my kind of blog
and there you can find my email or somehow contact me in other way.
And I am an active member of the Telegram chat called CX6.pro.
There's 2,000 people.
Everyone is well-educated and knows a lot about C++,
and there are a lot of interesting talks.
Okay.
It's been great having you on the show today.
Thanks for coming on.
Thanks for calling.
Yeah, thanks for joining us.
Thanks so much for listening in as we chat about C++.
I'd love to hear what you think of the podcast.
Please let me know if we're discussing the stuff you're interested in,
or if you have a suggestion for a topic, I'd love to hear what you think of the podcast. Please let me know if we're discussing the stuff you're interested in, or if you have a suggestion for a topic, I'd love to hear about that too.
You can email all your thoughts to feedback at cppcast.com. I'd also appreciate if you like CppCast on Facebook and follow CppCast on Twitter. You can also follow me at Rob W. Irving and Jason
at Leftkiss on Twitter. And of course, you can find all that info and the show notes on the podcast website at cppcast.com.
Theme music for this episode is provided by podcastthemes.com.