обнаружение typedef во время компиляции (метапрограммирование шаблона)

StackOverflow https://stackoverflow.com/questions/7834226

Вопрос

Я сейчас занимаюсь метапрограммированием шаблонов. В моем случае я могу обрабатывать любой "повторяемый" тип, то есть любой тип, для которого существует код typedef foo const_iterator. Я пытался использовать для этого новое метапрограммирование шаблона C ++ 11, однако мне не удалось найти метод, позволяющий определить, отсутствует ли определенный тип.

Поскольку мне также нужно включать / выключать другие специализации шаблонов на основе других характеристик, в настоящее время я использую шаблон с двумя параметрами, а второй создается с помощью std::enable_if. Вот что я сейчас делаю:

Genracodicetagpre

Мне не удалось сделать что-то подобное без вспомогательного шаблона exists. Например, просто выполняя

Genracodicetagpre

не сработал, потому что в тех случаях, когда должна использоваться эта специализация, вместо этого создавался недопустимый вариант по умолчанию.

Однако я не смог найти этот код 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 следующим образом:

родовое слово
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top