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
Используйте события, когда у Вас есть поток, который ожидает на одном из или всех многих событиях, чтобы сделать что-то.
Использование монитор, если Вы хотите ограничить доступ к структуре данных путем ограничения, сколько потоков может получить доступ к нему.
Мониторы обычно защищают ресурс, тогда как события говорят Вам, что что-то происходит, как закрывающееся приложение.
кроме того, события можно назвать (см. метод OpenExisting), это позволяет им использоваться для синхронизации через различные процессы.
Это учебное руководство подробно изложило описания того, что необходимо будет знать: http://www.albahari.com/threading/
, В частности, это покроет классы XXXResetEvent,
http://www.albahari.com/threading/part2.aspx
, и это покроет, Ожидайте/Пульсируйте: http://www.albahari.com/threading/part4.aspx#_Wait_and_Pulse
In my opinion, it's better to use Monitor if you can, Monitor.Wait and Monitor.Pulse/PulseAll are used for signalling between threads (as are Manual/AutoResetEvent) however Monitor is quicker, and doesn't use a native system resource. Also apparently Monitor is implemented in user mode and is managed, whereas Manual/AutoResetEvents require switching to kernel mode and p/invoke out to native win32 calls that use a wait handle.
There are situations where you would need to use Manual/AutoResetEvent, for example, to signal between processes you can use named events, and I guess to signal native threads in your app.
I am just regurgitating what I have read in this excellent article about threading.
The whole article is worth reading, however the link takes you to the wait handle section that details the events and monitor wait/pulse.