Войти
ПрограммированиеПодсказкиОбщее

Шаблон функции зависящий от наличия нужного поля в структуре

Внимание! Этот документ ещё не опубликован.

Автор:

Иногда нужно сделать условную проверку какого-либо поля структуры либо класса, в зависимости от того есть ли такое поле вообще в структуре.

В Visual С++ есть ключевое слово __if_exists, но во-первых оно нестандартное, а во-вторых настоятельно не рекомендуется документацией для использования в шаблонах.

Из стандартных методов существует шаблон использующий принцип SFINAE:
http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detector
Немного сократив его, так как нам не нужен вывод логической константы, а просто вызов нужной функции, получим следующий полезный макрос, не требующий особого вникания в шаблонную магию и привлечения boost.

// Проверка наличия поля в классе 
// применяется последним аргументом шаблона функции зависящей от наличия поля: 
// , HasMember( класс::поле ) 

template<typename M, M> struct CheckMember;
#define HasMember( memberName ) CheckMember<decltype(&memberName), &memberName> * = 0

Применяется например следующим образом:

// специализация если есть поле
template<class T> inline bool NotEndMarker(T& structArray, HasMember( T::EndMarker ) )
{
  return structArray.EndMarker != -1;
}
// специализация если нет поля
template<class T> inline bool NotEndMarker(T& structArray, ... )
{
  return true;
}
Вызывается такая функция с одним аргументом, ссылкой на нужную структуру.

#C++

17 февраля 2012