Я сейчас занимаюсь метапрограммированием некоторых шаблонов. В моем случае я могу обрабатывать любой «итеративный» тип, то есть любой тип, для которого typedef foo const_iterator
существует таким же образом. Для этого я пытался использовать новое метапрограммирование шаблона C ++ 11, однако не смог найти метод, позволяющий определить, отсутствует ли определенный тип.
Поскольку мне также необходимо включить / выключить другие специализации шаблона, основанные на других характеристиках, в настоящее время я использую шаблон с двумя параметрами, а второй создается с помощью std::enable_if
. Вот что я сейчас делаю:
template <typename T, typename Enable = void>
struct Foo{}; // default case is invalid
template <typename T>
struct Foo< T, typename std::enable_if<std::is_fundamental<T>::value>::type>{
void do_stuff(){ ... }
};
template<typename T>
struct exists{
static const bool value = true;
};
template<typename T>
struct Foo<T, typename std::enable_if<exists< typename T::const_iterator >::value >::type> {
void do_stuff(){ ... }
};
Мне не удалось сделать что-то подобное без вспомогательного шаблона exists
. Например, просто сделать
template<typename T>
struct Foo<T, typename T::const_iterator> {
void do_stuff(){ ... }
};
не сработало, потому что в тех случаях, когда следует использовать эту специализацию, вместо этого создавался недействительный случай по умолчанию.
Однако я не смог найти этот exists
в новом стандарте C ++ 11, который, насколько я знаю, просто берет boost::type_traits
для такого рода вещей. Однако на домашней странице для boost::type_traits
нет ссылки на что-либо, что можно использовать вместо этого.
Эта функциональность отсутствует, или я упустил какой-то другой очевидный способ достижения желаемого поведения?