Информация об изменениях

Сообщение Re[3]: концептуальный wish you happy debug от 20.11.2024 8:21

Изменено 20.11.2024 10:48 vopl

Re[3]: концептуальный wish you happy debug
Здравствуйте, vdimas, Вы писали:

V>А есть внятное объяснение, почему это работает? ))


При каждом обращении на значение fable делается заново переисчисление Entropy (в связи с механизмом его поставки через дефолтное значение), а там кложура, которая каждый раз новая/уникальная. Таким образом каждый раз получаем новую инстанцию с новой Entropy, ну и как побочный эффект, перевычисляется наша полезная нагрузка. Кстати, такое не обязательно делать на концептах, можно и на SFINAE
  например
#include <type_traits>

template <class T, auto e, class=void>
struct Fable : std::false_type {};

template <class T, auto e>
struct Fable<T, e, std::void_t<decltype(f(T{}))>> : std::true_type {};

template <class T, auto e = []{}>
constexpr bool fable = Fable<T, e>::value;

struct C{};
static_assert(!fable<C>);

void f(C);
static_assert(fable<C>);
Re[3]: концептуальный wish you happy debug
Здравствуйте, vdimas, Вы писали:

V>А есть внятное объяснение, почему это работает? ))


При каждом обращении на значение fable делается заново переисчисление Entropy (в связи с механизмом его поставки через дефолтное значение), а там кложура, которая каждый раз новая/уникальная. Таким образом каждый раз получаем новую инстанцию с новой Entropy, ну и как побочный эффект, перевычисляется наша полезная нагрузка. Кстати, такое не обязательно делать на констрейнтах, можно и на SFINAE
  например
#include <type_traits>

template <class T, auto e, class=void>
struct Fable : std::false_type {};

template <class T, auto e>
struct Fable<T, e, std::void_t<decltype(f(T{}))>> : std::true_type {};

template <class T, auto e = []{}>
constexpr bool fable = Fable<T, e>::value;

struct C{};
static_assert(!fable<C>);

void f(C);
static_assert(fable<C>);