обнаружение typedef во время компиляции (метапрограммирование шаблона)
-
27-10-2019 - |
Вопрос
Я сейчас занимаюсь метапрограммированием шаблонов. В моем случае я могу обрабатывать любой "повторяемый" тип, то есть любой тип, для которого существует код typedef foo const_iterator
. Я пытался использовать для этого новое метапрограммирование шаблона C ++ 11, однако мне не удалось найти метод, позволяющий определить, отсутствует ли определенный тип.
Поскольку мне также нужно включать / выключать другие специализации шаблонов на основе других характеристик, в настоящее время я использую шаблон с двумя параметрами, а второй создается с помощью std::enable_if
. Вот что я сейчас делаю:
Мне не удалось сделать что-то подобное без вспомогательного шаблона exists
. Например, просто выполняя
не сработал, потому что в тех случаях, когда должна использоваться эта специализация, вместо этого создавался недопустимый вариант по умолчанию.
Однако я не смог найти этот код exists
в новом стандарте C ++ 11, который, насколько мне известно, просто взят из кода boost::type_traits
для такого рода вещей. Однако на домашней странице для boost::type_traits
есть не показывать никаких ссылок на что-либо, что можно было бы использовать вместо этого.
Эта функция отсутствует или я упустил из виду другой очевидный способ добиться желаемого поведения?
Решение
Если вы просто хотите, чтобы данный тип содержал код const_iterator
, то ниже приводится упрощенная версия вашего кода:
См. этот ответ для объяснения того, как работает этот метод.
Другие советы
Вы можете создать trait has_const_iterator
, который предоставляет логическое значение и использовать его в специализации.
Что-то вроде этого может сделать это:
родовое словоА потом вы можете специализироваться так:
родовое словоВот еще одна версия проверки черты типа члена:
родовое слово Сделать это можно двумя способами.В C ++ 03 вы можете использовать boost и enable_if
для определения признака ( документы , источник ):
В C ++ 11 вы можете использовать Tick следующим образом:
родовое слово Также с помощью Tick вы можете дополнительно улучшить свойство, чтобы на самом деле определить, что генерируемый код кода на самом деле является итератором., также.Скажем, мы определяем простую черту const_iterator
следующим образом:
Затем мы можем определить признак is_iterator
, чтобы проверить, соответствует ли тип has_const_iterator
признаку const_iterator
следующим образом: