Super Simple Named Boolean Parameters
Quite often we come across interfaces with multiple boolean parameters, like this:
cake make_cake (bool with_dairy, bool chocolate_sauce, bool poison);
A call to this function might look like:
auto c = make_cake(true, true, false);
Unfortunately, this is not very descriptive. We need to look at the declaration of the function to know what each of those
bools mean, and it would be way too easy to accidentally flip the wrong argument during maintainance and end up poisoning ourselves rather than having a chocolatey treat.
There are many solutions which people use, from just adding comments to each argument, to creating tagged types. I recently came across a very simple trick which I had not seen before:
#define K(name) true
Yep, it’s a macro which takes an argument and gets replaced by
true. This may look strange, but it enables us to write this:
auto c = make_cake(K(with_dairy), !K(chocolate_sauce), !K(poison)); // or using `not` if you prefer auto c = make_cake(K(with_dairy), not K(chocolate_sauce), not K(poison));
Of course, it’s up to you whether you think using a macro for this kind of thing is worth it, or if you think that macro should have a name which is less likely to collide. There’s also the issue that this looks a bit like Python named parameters, where you can pass them in any order, but the order matters here. There are much better solutions when you own the interface, but for the times when you don’t, I think this is a neat trick to solve the issue in a low-overhead manner.
A guess I need to come up with a marketing name for this. Since we already have X Macros, I hereby dub this trick “K Macros”.
Let me know what you think of this article on twitter @TartanLlama or leave a comment below!