C ++ 17, вероятно, предоставит общие средства для запросов к функциям. Подробнее см. В N4502 , но в качестве самостоятельного примера рассмотрим следующее.
Эта часть является постоянной частью, помещает ее в заголовок.
// See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4502.pdf.
template
using void_t = void;
// Primary template handles all types not supporting the operation.
template class, typename = void_t<>>
struct detect : std::false_type {};
// Specialization recognizes/validates only types supporting the archetype.
template class Op>
struct detect>> : std::true_type {};
В следующем примере, взятом из N4502 , показано использование:
// Archetypal expression for assignment operation.
template
using assign_t = decltype(std::declval() = std::declval())
// Trait corresponding to that archetype.
template
using is_assignable = detect;
. По сравнению с другими реализациями это довольно просто: приведенный набор инструментов ( void_t
и detect
). Кроме того, сообщалось (см. N4502 ), что оно заметно более эффективно (время компиляции и потребления памяти компилятора), чем предыдущие.
Вот живой пример , который включает настройки переносимости для GCC pre 5.1.