typedef typename Tail::inUnion dummy;
Однако я не уверен, что Вы - реализация inUnion, корректно. Если я понимаю правильно, этот класс, как предполагается, не инстанцируют, поэтому вкладка "сбоя" никогда не будет avtually сбои. Возможно, было бы лучше, указывает, является ли тип в объединении или не с простым булевым значением.
template
struct Contains; template struct Contains > { enum { result = Contains ::result }; }; template struct Contains > { enum { result = true }; }; template struct Contains { enum { result = false }; }; пз: Взгляните на Повышение:: Вариант
PS2: Взгляните на списки типов , особенно в книге Andrei Alexandrescu: современный Дизайн
C++
Из python docs :
Расширенное использование: вы можете получить подклассы шаблона для настройки синтаксис заполнителя, разделитель персонаж или весь обычный выражение, используемое для анализа шаблона струны. Для этого вы можете переопределить эти атрибуты класса:
разделитель - это буквальная строка, описывающая заполнитель вводим разделитель. По умолчанию значение $. Обратите внимание, что это не должно быть регулярное выражение, как реализация вызовет re.escape () в этой строке по мере необходимости.
idpattern - это регулярное выражение, описывающее шаблон для заполнители без фигурных скобок (фигурные скобки будет добавлен автоматически как подходящее). Значение по умолчанию - регулярное выражение [_a-z] [_ a-z0-9] *.
Пример:
from string import Template
class MyTemplate(Template):
delimiter = '#'
idpattern = r'[a-z][_a-z0-9]*'
>>> s = MyTemplate('#who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes $what'
В python 3:
Новое в версии 3.2.
В качестве альтернативы вы можете предоставить весь шаблон регулярного выражения путем переопределения шаблона атрибута класса. Если вы сделаете это, значение должен быть объектом регулярного выражения с четырьмя именованными группами захвата. Группы захвата соответствуют правилам, приведенным выше, а также неправильное правило заполнителя:
- экранированный - Эта группа соответствует управляющей последовательности, например $$, в шаблоне по умолчанию.
- named - Эта группа соответствует имени свободного заполнителя; он не должен включать разделитель в группу захвата.
- фигурные скобки - эта группа соответствует имени заполнителя, заключенному в фигурные скобки; он не должен содержать ни разделителя, ни фигурных скобок в захвате group.
- недопустимый - эта группа соответствует любому другому шаблону разделителя (обычно с одним разделителем) и должна появляться последней в обычном выражение.
Пример:
from string import Template
import re
class TemplateClone(Template):
delimiter = '$'
pattern = r'''
\$(?:
(?P<escaped>\$) | # Escape sequence of two delimiters
(?P<named>[_a-z][_a-z0-9]*) | # delimiter and a Python identifier
{(?P<braced>[_a-z][_a-z0-9]*)} | # delimiter and a braced identifier
(?P<invalid>) # Other ill-formed delimiter exprs
)
'''
class TemplateAlternative(Template):
delimiter = '[-'
pattern = r'''
\[-(?:
(?P<escaped>-) | # Expression [-- will become [-
(?P<named>[^\[\]\n-]+)-\] | # -, [, ], and \n can't be used in names
\b\B(?P<braced>) | # Braced names disabled
(?P<invalid>) #
)
'''
>>> t = TemplateClone("$hi sir")
>>> t.substitute({"hi": "hello"})
'hello sir'
>>> ta = TemplateAlternative("[-hi-] sir")
>>> ta.substitute({"hi": "have a nice day"})
'have a nice day sir'
>>> ta = TemplateAlternative("[--[-hi-]-]")
>>> ta.substitute({"hi": "have a nice day"})
'[-have a nice day-]'
По-видимому, также можно просто опустить любую из групп регулярных выражений с экранированием
, с именами
, в скобках
или недопустимый
, чтобы отключить его.