From e6f439cb43ee51b13ed4d29ec84ac5450556b163 Mon Sep 17 00:00:00 2001 From: Johannes Stoelp Date: Wed, 24 Aug 2022 18:09:52 +0200 Subject: c++: add any_of meta fn example --- src/development/c++.md | 14 +++++++++++++- src/development/c++/meta.cc | 4 ++++ src/development/c++/meta3.cc | 22 ++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/development/c++/meta3.cc (limited to 'src/development') diff --git a/src/development/c++.md b/src/development/c++.md index 4ce1538..aff9ccd 100644 --- a/src/development/c++.md +++ b/src/development/c++.md @@ -16,7 +16,19 @@ typename decltype(foo)::_; {{#include c++/meta.cc:3:}} ``` -## [SFINAE][sfinae] example ([enable_if][enable-if]) +## Example: `is_any_of` template meta function + +```cpp +{{#include c++/meta3.cc:3:}} +``` + +## Example: [SFINAE][sfinae] ([enable_if][enable-if]) + +Provide a single entry point `Invoke` to call some `Operations`. +Use `enable_if` to enable/disable the template functions depending on the two +available traits an operation can have: +- Operation returns a result +- Operation requires a context ```cpp {{#include c++/meta2.cc:3:}} diff --git a/src/development/c++/meta.cc b/src/development/c++/meta.cc index e674cfd..efb3b22 100644 --- a/src/development/c++/meta.cc +++ b/src/development/c++/meta.cc @@ -2,6 +2,8 @@ #include +// -- Example 1 - print template value arguments. + // Base case with one parameter. template void show_int() { @@ -15,6 +17,8 @@ void show_int() { show_int(); } +// -- Example 2 - print values of different types. + // Base case with one parameter. template void show(const T& t) { diff --git a/src/development/c++/meta3.cc b/src/development/c++/meta3.cc new file mode 100644 index 0000000..5dce54a --- /dev/null +++ b/src/development/c++/meta3.cc @@ -0,0 +1,22 @@ +// Copyright (C) 2022 johannst + +#include + +template +struct any_of : std::false_type {}; + +// Found our type T in the list of types U. +template +struct any_of : std::true_type {}; + +// Pop off the first element in the list of types U, +// since it didn't match our type T. +template +struct any_of : any_of {}; + +// Convenience template variable to invoke meta function. +template +constexpr bool any_of_v = any_of::value; + +static_assert(any_of_v, ""); +static_assert(!any_of_v, ""); -- cgit v1.2.3