Вы ошибаетесь. Пример ввел вас в заблуждение.
Если вы ещё раз внимательно посмотрите на этот пример, то вы заметите: нигде не используются объекты типов-тэгов.
Другими словами, этим структурам вообще не нужны определения (не нужны туловища).
Достаточно будет forward declaration.
И поэтому этот пример не может быть примером использования пустышек.
---------------------------------------
Вот настоящий пример использования пустышек:
В рамках с++03 реализация имитации variardic template (функций с переменным количеством аргументов, с сохранением типо безопасности):
void Foo(Arg a1, Arg a2 = SEmpty(), Arg a3 = SEmpty() )
{
...
}
Здесь можно указать от 1 до 3х аргументов.
Arg - это механизм, способный принять ссылку любого объекта и проконтролировать типо безопасность.
(при извлечении будет выполнена проверка квалификаторов и типов)
При вызове функции Foo, все не указанные аргументы по умолчанию превратятся в пустышку SEmpty.
Внутри туловища функции Foo ожидают, что часть аргументов может быть пустышками.
Там умеют корректно обработать "отсутствие аргумента".
В те времена, когда ещё не было variardic template, данная практика позволяла написать всего одну не шаблонную функцию, вместо перегрузки множества шаблоно-функций.
И поскольку, функция не шаблонная, её можно сделать виртуальной.
Отсюда главная фишка метода - таким образом можно изготовить "имитацию виртуальной шаблоно-функции с переменным количеством аргументов".