RFR: 8251274: Provide utility types for function SFINAE using extra template parameters

Lois Foltan lois.foltan at oracle.com
Wed Sep 2 15:40:45 UTC 2020



On 9/1/2020 9:43 PM, Kim Barrett wrote:
>> On Sep 1, 2020, at 1:26 PM, Lois Foltan <lois.foltan at oracle.com> wrote:
>>
>> On 9/1/2020 4:55 AM, Kim Barrett wrote:
>>>> On Aug 31, 2020, at 9:43 AM, Kim Barrett <kim.barrett at oracle.com> wrote:
>>>>
>>>>> On Aug 31, 2020, at 5:38 AM, Erik Österlund <erik.osterlund at oracle.com> wrote:
>>>>>
>>>>> Hi Kim,
>>>>>
>>>>> Looks good.
>>>> Thanks
>>>>
>>>>> Thanks,
>>>>> /Erik
>>>>>
>>>>> On 2020-08-31 11:18, Kim Barrett wrote:
>>>>>> […] OK.  Then here’s a new webrev.  (The gtest file has no changes now, but still shows up in the
>>>>>> webrev because of the change then revert in the patch series.)  Just a full, since there seems
>>>>>> little point in an incremental.
>>>>>>
>>>>>> https://cr.openjdk.java.net/~kbarrett/8251274/open.01/
>>> Given the changes we’ve discussed, the summary for the bug should probably be changed from
>>> “utility types” to “utility macro”.
>>>
>> Hi Kim,
>>
>> This looks good.
> Thanks.
>
>>   After reading through the discussion with Erik, I am glad about the resulting ENABLE_IF macro.  I do have one question/comment which might just be for my clarification.  I am assuming I can also still use this new C++11  extra anonymous non-type template parameter with a default value as the return type?
> I'm not sure I understand your question, so apologies if I've misinterpreted
> and answered something else.
>
> The new macro, and the new in C++11 mechanism it uses, is only in template
> parameter lists.
>
> You can still use the old technique of a SFINAE expression for a function's
> result type.  That is, this still works:
>
>    template<typename T>
>    typename EnableIf<std::is_integral<T>::value, bool>::type
>    foo(T x) { ... }
>
> is a function returning bool that is only applicable if the argument is an
> int.  Though with C++11 one could instead write that as
>
>    template<typename T>
>    std::enable_if_t<std::is_integral<T>::value, bool>
>    foo(T x) { ... }
>
> But why would you, when you can separate the SFINAE part from the signature,
> improving readability:
>
>    template<typename T, ENABLE_IF(std::is_integral<T>::value)>
>    bool foo(T x) { … }

Hi Kim,

Yes, I wanted to understand how would the new ENABLE_IF macro be used 
for the return type.  Thank you for detailing the different coding 
examples and I like your suggestion of the last example of separating 
the SFINAE part from the signature.

Thanks,
Lois

>>   In addition, if I am allowed to use this as the return type, I further assume that it is also allowed to use a single template parameter that is a conjunction of expressions for the return type too?
> In each of the above examples, `std::is_integral<T>::value` is in a
> syntactic position that must be an expression. Any boolean expression will
> do, including a conjunction of subexpressions.
>



More information about the hotspot-dev mailing list