В настоящее время я выполняю метапрограммирование шаблонов. В моем случае я могу обрабатывать любой "итеративный" тип, т.е. Любой тип, для которого a typedef foo const_iterator
существует таким же образом. Я пытался использовать новый метапрограммирование шаблона С++ 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
в любом месте в новом стандарте С++ 11, который, насколько я знаю, просто берет из boost::type_traits
для такого рода вещей. Однако на домашняя страница для boost::type_traits
не отображается ссылка на все, что можно было бы использовать вместо этого.
Является ли эта функциональность отсутствующей, или я не заметил другого очевидного способа достижения желаемого поведения?