Я сделал гибридную черты генератора макрос, который проверяет либо членов, либо свободные постоянные функции.
Это создает классы шаблонов шаблонов, которые смотрят, работает ли поставленная пользователем подпись (первый шаблон arg) с именем, встроенным в класс признаков.
Он ищет свободностоящие имена, если второй параметр шаблона не задан (Trait<Sig>::value
) или для члена второго аргумента шаблона, если шаблон шаблонов создается с двумя аргументами (Trait<Sig,ClassToSearch>::value
).
Он может выполнять поиск только бесплатных функций, которые были объявлены до того, как был определен класс шаблонов.
#define DEF_HAS_SIG(TraitsName, funcName) \
std::nullptr_t funcName(...); \
template<typename Sig, typename Type=void> class TraitsName { \
typedef char yes[1]; \
typedef char no [2]; \
template <typename U, U> struct TypeCheck; \
template <typename _1, typename _2 > static no &chk(...); \
template <typename _1, typename _2> static \
typename std::enable_if< std::is_same<void,_2>::value, yes&>::type chk(TypeCheck<_1, &funcName > *); \
template <typename _1, typename _2> static yes& chk(TypeCheck<_1, &_2::funcName > *); \
public: static bool const value = sizeof(chk<Sig,Type>(0)) == sizeof(yes); \
};
Если имя существует, мы можем проверить его подпись/или если он может принимать некоторые параметры. – Jarod42
@ Jarod42 Я хотел бы проверить, объявлен ли 'int :: fprintf_unlocked (FILE *, const char *, ...)'. Как я могу это сделать? – PSkocik
У меня возникли трудности с поиском документов для 'fprintf_unlocked'. это то же самое, что и 'fprintf', кроме без автоматической защиты потоков на gnu libc? – jaggedSpire