Как работает реализация meta :: defer в range-v3?

Вот реализация meta::defer:

template <template <typename...> class C, typename... Ts>
struct defer : detail::defer_<C, Ts...> {};

detail::defer_

template <template <typename...> class C, typename... Ts>
using defer_ = decltype(detail::try_defer_<C, Ts...>(0));

detail::try_defer

    template <template <typename...> class C, typename... Ts,
template <typename...> class D = C>
id<D<Ts...>> try_defer_(int);
template <template <typename...> class C, typename... Ts> nil_ try_defer_(long);

struct id

    template <typename T> struct id {
#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 5 &&                \
!defined(META_DOXYGEN_INVOKED)
// Redirect through decltype for compilers that have not
// yet implemented CWG 1558:
// <http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1558>
static id impl(void *);

template <typename... Ts>
using invoke = _t<decltype(id::impl(static_cast<list<Ts...> *>(nullptr)))>;
#else
template <typename...> using invoke = T;
#endif

using type = T;
};

struct nil_ {};

официальный документ (пример использования)

Оболочка, которая задерживает создание экземпляра шаблона C с параметрами типа Ts в лямбда-выражении или выражении let.

В приведенном ниже коде лямбда в идеале должна быть записана как лямбда<_a, _b, push_back<_a, _b >>, однако это терпит неудачу, так как push_back ожидает, что его первый аргумент будет списком, а не заполнителем. Вместо этого мы выражаем это, используя defer следующим образом:

template<typename List>
using reverse = reverse_fold<List, list<>, lambda<_a, _b, defer<push_back, _a, _b>>>;

Согласно варианту использования, meta::defer кажется, отложить выражение до работы SFINAE. Но я не могу понять, как работает реализация.

Вопрос

1. Как работает meta::defer Работа?

2. libcxx также имеет struct __dependent_type, чье определение:

template <class _Tp, bool>
struct _LIBCPP_TEMPLATE_VIS __dependent_type : public _Tp {};

а также Я также задаю вопрос о __dependent_type(чтобы избежать повторений, я не ставлю детали __dependent_type Вот)

Если meta::defer просто отложить выражение для SFINAE, можно ли заменить его на __dependent_type выше и почему?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector