Я смотрел вторую часть Уолтер Браун CppCon2014 беседует о метапрограммировании шаблонов, в ходе которого он обсудил использование своей романной конструкции void_t<>
, Во время своего выступления Питер Соммерлад задал ему вопрос, который я не совсем понял. (ссылка идет непосредственно на вопрос, обсуждаемый код проходил непосредственно перед этим)
Соммерлад спросил
Уолтер, это означало бы, что мы действительно можем реализовать концепции lite прямо сейчас?
на который ответил Уолтер
О да! Я сделал это... У него совсем не такой синтаксис.
Я понял, что этот обмен относится к Concepts Lite. Действительно ли этот шаблон универсален? По какой-то причине я этого не вижу. Может кто-нибудь объяснить (или эскиз), как что-то подобное может выглядеть? Является ли это примерно enable_if
и определяющими чертами, или то, на что ссылался вопросик?
Шаблон void_t
определяется следующим образом:
template<class ...> using void_t = void;
Он использует это, чтобы определить, правильно ли сформированы инструкции типа, используя это для реализации черты типа is_copy_assignable
:
//helper type
template<class T>
using copy_assignment_t
= decltype(declval<T&>() = declval<T const&>());
//base case template
template<class T, class=void>
struct is_copy_assignable : std::false_type {};
//SFINAE version only for types where copy_assignment_t<T> is well-formed.
template<class T>
struct is_copy_assignable<T, void_t<copy_assignment_t<T>>>
: std::is_same<copy_assignment_t<T>,T&> {};
Из-за разговора я понимаю, как работает этот пример, но я не вижу, как мы получаем отсюда нечто вроде Concepts Lite.