Bruno Dutra wrote:
I agree that it does not have a "lazy backend" in the sense of my previous replies, but I don't see your point, ...
My point is that is_evaluable works on metafunctions regardless of whether they have lazy backends or not. You were citing is_evaluable as a motivating example that lazy backends are necessary, but it doesn't need them. I do agree that for branching one does need laziness. So if you want, f.ex. template<class Def, template<class...> class F, class... T> using eval_or_default = /**/ // if is_evaluable<F, T...> returns F<T...> else returns Def then I agree that you have to have a lazy if. My basic question is "do you need laziness for something else apart from lazy if?"
...but now at the expense of not being able to even provide a lazy version to the end user...
The lazy version is not hard to recover, but I'm still wondering whether it's even necessary outside of if. template<template<class...> class F, class... T> struct mp_defer { using type = F<T...>; };