> On Aug 22, 2017, at 9:17 PM, JF Bastien <[email protected]> wrote: > > I'd suggest considering what it'll look like when we're migrating to concepts > in C++20. > > Here's an example for our bitwise_cast: > https://github.com/jfbastien/bit_cast/blob/master/bit_cast.h#L10 > <https://github.com/jfbastien/bit_cast/blob/master/bit_cast.h#L10> > > Notice the 3 ways to enable. There's also the option of using enable_if on > the return value, or as a defaulted function parameter, but I'm not a huge > fan of either.
I think the concepts approach is the cleanest. I’d avoid the macro if we go that way. But C++20 is a long way away and I only expect this problem to get worse over time. So I’d rather find a nearer term solution. > On Aug 22, 2017, at 9:13 PM, Chris Dumez <[email protected]> wrote: > > I personally prefer std::enable_if<>. For e.g. > > template<typename T, class = typename std::enable_if<std::is_same<T, > int>::value> > Class Foo { } I just find this much harder to parse since I now have to: 1) recognize that the last class is not a actually polymorphic parameter 2) figure out exactly what the condition is given that it’s hidden inside an enable_if* The plus side of using a static_assert based approach is that it doesn’t impact the readability of function/class signature at a high level since it’s nested inside the body. It’s also not hidden particularly hidden since I would expect it to be the first line of the body Another downside of enable_if as a default template parameter is that someone could make a mistake and pass an extra template value, e.g. Foo<float, int>, and it might pick the wrong template parameter. This isn’t super likely but it’s still a hazard. Admittedly, we could make a macro like (totes not stolen from JF’s GitHub): #define ENABLE_TEMPLATE_IF(condition) typename = typename std::enable_if<condition>::type and implement Foo as: template<typename T, ENABLE_TEMPLATE_IF(std::is_same<T, int>::value)> class Foo { }; I think this approach is pretty good, although, I think I care about the enable_if condition rarely enough that I’d rather not see it in the signature. Most of the time the code will look like: template<typename T, ENABLE_TEMPLATE_IF(std::is_same<T, int>::value)> class Foo {...}; template<typename T, ENABLE_TEMPLATE_IF(std::is_same<T, float>::value)> class Foo {...}; template<typename T, ENABLE_TEMPLATE_IF(std::is_same<T, double>::value)> class Foo {...}; So when I know I want to use a Foo but I forgot the signature I now need to look mentally skip the enable_if macro, which I’d rather avoid. > > I don’t like that something inside the body of a class / function would cause > a template to be enabled or not. I believe there are cases where this already basically already happens e.g. bitwise_cast. Although, I think those cases could be fixed with a more standard approach. Cheers, Keith > > -- > Chris Dumez > > > > >> On Aug 22, 2017, at 8:34 PM, Keith Miller <[email protected] >> <mailto:[email protected]>> wrote: >> >> Hello fellow WebKittens, >> >> I’ve noticed over time that we don’t have standard way that we enable >> versions of template functions/classes (flasses?). For the most part it >> seems that people use std::enable_if, although, it seems like it is attached >> to every possible place in the function/class. >> >> I propose that we choose a standard way to conditionally enable a template. >> >> There are a ton of options; my personal favorite is to add the following >> macro: >> >> #define ENABLE_TEMPLATE_IF(condition) static_assert(condition, “template >> disabled”) >> >> Then have every function do: >> >> template<typename T> >> void foo(…) >> { >> ENABLE_TEMPLATE_IF(std::is_same<T, int>::value); >> … >> } >> >> And classes: >> >> template<typename T> >> class Foo { >> ENABLE_TEMPLATE_IF(std::is_same<T, int>::value); >> }; >> >> I like this proposal because it doesn’t obstruct the signature/declaration >> of the function/class but it’s still obvious when the class is enabled. >> Obviously, I think we should require that this macro is the first line of >> the function or class for visibility. Does anyone else have thoughts or >> ideas? >> >> Cheers, >> Keith >> >> P.S. in case you are wondering why this macro works (ugh C++), it’s because >> if there is any compile time error in a template it cannot be selected as >> the final candidate. In my examples, if you provided a type other than int >> foo/Foo could not be selected because the static_assert condition would be >> false, which is a compile error. >> _______________________________________________ >> webkit-dev mailing list >> [email protected] <mailto:[email protected]> >> https://lists.webkit.org/mailman/listinfo/webkit-dev >
_______________________________________________ webkit-dev mailing list [email protected] https://lists.webkit.org/mailman/listinfo/webkit-dev

