RFR: 8258853: Support separate function declaration and definition with ENABLE_IF-based SFINAE
John R Rose
jrose at openjdk.java.net
Wed Jan 20 22:40:52 UTC 2021
On Mon, 18 Jan 2021 14:07:36 GMT, Kim Barrett <kbarrett at openjdk.org> wrote:
> [Restarting this PR after some offline discussion with jrose. New name for
> the macro, and some additional commentary and tests.]
>
> Please review this change which adds the ENABLE_IF_SDEFN macro. This is
> used in the definition of a function template when that definition is
> separate from a declaration that uses ENABLE_IF.
>
> Alternative names for the new macro are possible and even solicited. I
> know, I'm asking for bikeshedding.
>
> The ENABLE_IF macro provides convenient syntax for function template SFINAE
> using the new default template parameter feature of C++11. However, this
> macro can only be used in the function declaration (which may also be a
> definition).
>
> The syntax needed in a definition that is separate from the declaration is
> different, but the type forms for the non-type template parameters in the
> two places must be "equivalent" (C++14 14.5.6). The precise form for
> ENABLE_IF is "hidden" behind the macro. It is not desirable to have
> template definitions making assumptions about that form. This suggests
> there should be a second macro for use in the separate definition case, with
> the two macros maintained together to ensure the necessary consistency.
>
> (Note that some versions of gcc permit the unused default in some separate
> definitions. Other tool chains reject it. Because of this, I was only
> vaguely aware of (and had long forgotten) about this issue when proposing
> ENABLE_IF, despite having extensively used similar mechanisms in other code
> bases.)
>
> This gives the following usage:
>
> template<typename T, ENABLE_IF(std::is_integral<T>::value)>
> void foo(T x) { ... }
>
> and this for separate declaration and definition.
>
> template<typename T, ENABLE_IF(std::is_integral<T>::value)>
> void foo(T x);
>
> // later separate definition
> template<typename T, ENABLE_IF_SDEFN(std::is_integral<T>::value)>
> void foo(T x) { ... }
>
> (An alternative would be to just drop the macro usage entirely, at least in
> the separate definition case, and just accept the additional syntactic
> complexity. I'm not proposing that.)
>
> (Since I was touching the file anyway, I also improved some of the comments
> discussing details)
>
> Testing:
> mach5 tier1
> This includes some new gtests for the macros.
> There aren't any current non-test uses of ENABLE_IF_SDEFN yet.
Marked as reviewed by jrose (Reviewer).
-------------
PR: https://git.openjdk.java.net/jdk/pull/2129
More information about the hotspot-dev
mailing list