отвратительные типы функций комбинаторные могут быть настоящей болью при работе с шаблоном, основанным на сопоставлении типов функций (см. std :: is_function ).
Разные квалификаторы включая const, volatile, &, &&, noexcept (плюс поддержка аргументов variadi c) может привести к большому числу специализаций шаблонов.
Однако спецификатор noexcept
позволяет использовать логическое выражение noexcept(expr)
:
noexcept
эквивалентен noexcept(true)
по умолчанию
Итак, в будущем мы можем представить унификацию всех квалификаторов с этой моделью: * Квалификатор 1019 *
const
будет эквивалентен const(true)
volatile
Квалификатор будет эквивалентен volatile(true)
&
Квалификатор будет эквивалентен &(true)
&&
квалификатор будет эквивалентен &&(true)
И, благодаря глазурью на торте, сделайте классификаторы вычитаемыми, чтобы иметь возможность писать что-то вроде:
template <typename Fn>
struct function_traits;
template <typename R, bool CQ, bool VQ, bool LVRQ, bool RVRQ, bool NEQ, ARGS... Args>
struct function_traits<R(Args...) const(CQ) volatile(VQ) &(LVRQ) &&(RVRQ) noexcept(NEQ)>
{
static constexpr bool is_const_qualified = CQ;
static constexpr bool is_volatile_qualified = VQ;
static constexpr bool is_lvalue_ref_qualified = LVRQ;
...
};
Хотелось бы услышать любые мысли о таких вопросах.