typedef typename Tail::inUnion dummy;
Однако я не уверен, что реализация inUnion верна. Если я правильно понимаю, этот класс не должен быть создан, поэтому вкладка «fail» никогда не будет автоматически терпеть неудачу. Возможно, было бы лучше указать, находится ли тип в объединении или нет с простым булевым значением.
template
struct Contains; template struct Contains > { enum { result = Contains ::result }; }; template struct Contains > { enum { result = true }; }; template struct Contains { enum { result = false }; }; PS: Посмотрите на Boost :: Variant
PS2: посмотрите на typelists , особенно в книге Андрея Александреску: Modern C ++ Design
Неявное self
переменная на самом деле видимо в рамках всего выбора, не используя или иначе. Как указано, хотя, в настоящее время это не представляет ценности в выборе потребления, потому что поведение выбора потребления состоит в том, что экземпляр контракта, на котором осуществлен выбор, заархивирован перед казнью органа по выбору (то есть, семантика "предварительно использует"). В выпуске будущего набор аннотаций выбора расширится для включения preconsuming
и postconsuming
. В выборе постпотребления контракт, упомянутый self
, останется активным всюду по органу по выбору и будет заархивирован в конце. Выбор, не аннотируемый preconsuming
, noconsuming
или postconsuming
, примет значение по умолчанию к семантике перед потреблением (как это сегодня).