2014-11-22 3 views
3

Предоставляет ли C++ 11 возможность сократить длинные шаблонные имена шаблонов (std :: а также мои собственные типы)?C++ 11 типов псевдонимов типов для уменьшения боли

Это уменьшит боль при расшифровке и печати сообщений. Я хотел бы определить пользовательские псевдонимы, которые заменяют расширенные имена типов шаблонов уникальными и четко определенными альтернативами.

Использование typedef или using не помогает, поскольку компилятор и gdb все равно распечатывают полное имя типа. Алиасы должны быть доступны для stl, а также для пользовательских шаблонов. В идеале gcc, clang и gdb должны использовать пользовательские имена.

ответ

1

В некоторых случаях я уменьшил боль, заменив using или typedef с наследованием; например вместо using MyType = MyTemplate<MyTraits<Blah>> делает

struct MyType : MyTemplate<MyTraits<Blah>> 
{ 
    // possibly some stuff 
}; 

использований MyType в последнем случае будет как раз то, где в качестве типа псевдонима (using или typedef) компилятор и отладчик распечатает длинные сложные типы, которые иногда могут быть менее информативны, в то время как в последнем случае он просто напечатает MyType. possibly some stuff - это муха в мазе, поскольку наследование теперь введено.

+0

не приведет к предупреждению компилятора о виртуальных деструкторах? –

+0

@mic_e, только если вы используете '-Wnon-virtual-dtor' или глубоко ошибочную опцию' -WeffC++'. Не делай этого. '-Wdelete-non-virtual-dtor' лучше во всех отношениях и разрешен' -Wall' –

+0

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

3

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

GCC имеет опцию -fno-pretty-templates, которая регулирует способ отображения шаблонов в диагностике.

Вы можете определить Type Printers в Python, чтобы сообщить GDB, как печатать ваш тип. Я написал несколько для libstdC++, чтобы GDB напечатал std::vector<X> не std::vector<X, std::allocator<X> >. Это не влияет на типы, показанные в диагностике компилятора, только в GDB.

Смежные вопросы