diff options
author | Jason Merrill <jason@redhat.com> | 2020-09-02 16:47:37 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2020-12-10 15:36:15 -0500 |
commit | 3cf63c94df4712569e0ab996155013a3a043bed3 (patch) | |
tree | ace8cabaa9a8553b576a222edb7e245246d67623 /gcc/cp/cp-tree.h | |
parent | 445430e16bd08ade34637d2346ded40dd49de508 (diff) | |
download | gcc-3cf63c94df4712569e0ab996155013a3a043bed3.zip gcc-3cf63c94df4712569e0ab996155013a3a043bed3.tar.gz gcc-3cf63c94df4712569e0ab996155013a3a043bed3.tar.bz2 |
c++: Add make_temp_override generator functions
A common pattern before C++17 is the generator function, used to avoid
having to specify the type of a container element by using a function call
to get type deduction; for example, std::make_pair. C++17 added class type
argument deduction, making generator functions unnecessary for many uses,
but GCC won't be written in C++17 for years yet.
gcc/cp/ChangeLog:
* cp-tree.h (struct type_identity): New.
(make_temp_override): New.
* decl.c (grokdeclarator): Use it.
* except.c (maybe_noexcept_warning): Use it.
* parser.c (cp_parser_enum_specifier): Use it.
(cp_parser_parameter_declaration_clause): Use it.
(cp_parser_gnu_attributes_opt): Use it.
(cp_parser_std_attribute): Use it.
Diffstat (limited to 'gcc/cp/cp-tree.h')
-rw-r--r-- | gcc/cp/cp-tree.h | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 5304f6b..5cd2999 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -1932,6 +1932,38 @@ public: ~temp_override() { overridden_variable = saved_value; } }; +/* Wrapping a template parameter in type_identity_t hides it from template + argument deduction. */ +#if __cpp_lib_type_identity +using std::type_identity_t; +#else +template <typename T> +struct type_identity { typedef T type; }; +template <typename T> +using type_identity_t = typename type_identity<T>::type; +#endif + +/* Object generator function for temp_override, so you don't need to write the + type of the object as a template argument. + + Use as auto x = make_temp_override (flag); */ + +template <typename T> +inline temp_override<T> +make_temp_override (T& var) +{ + return { var }; +} + +/* Likewise, but use as auto x = make_temp_override (flag, value); */ + +template <typename T> +inline temp_override<T> +make_temp_override (T& var, type_identity_t<T> overrider) +{ + return { var, overrider }; +} + /* The cached class binding level, from the most recently exited class, or NULL if none. */ |