2012-02-29 2 views
6

Возможно, странный вопрос, но есть ли какое-либо программное обеспечение, которое, учитывая кучу кода C++ 11, выводит все типы автоматических типизированных переменных и перезаписывает код с этими производными типами? А также для списков инициализаторов?Автоматическое переписывание ключевого слова C++ 11 auto в производные типы

Причина в том, что мы хотели бы предоставить обратно совместимую версию нашего кода (не C++ 11), в основном для переносимости с помощью osx. Списки автоматической печати и инициализации - это те функции, которые мы используем больше всего, поскольку они делают код более читаемым, но удаление их вручную - это не-go. Так как это то, что делает компилятор с автоматическими типизированными переменными, он не кажется слишком надуманным?

+1

libclang на помощь? – sehe

+0

Можете ли вы уточнить @sehe? Делает ли clang что-то таким образом? FYI, clang 3.0 не поддерживает достаточные возможности в C++ 11 для компиляции нашего кода. –

+1

@BroesDeCat: Он предлагал вам использовать библиотеку компилятора Clang для компиляции вашего кода, а затем записать его обратно, при этом 'auto' преобразуется в свои выведенные типы. –

ответ

2

Если вы можете использовать Boost, то вы можете посмотреть boost::typeof. Он не будет делать то, что делает auto, но в большинстве случаев он может быть автоматически заменен поиском regex-with-capture.

3

Посмотрите на BOOST_AUTO и/или BOOST_TYPEOF

Вы могли бы заменить

auto x = foo(); 

с

BOOS_AUTO(x, foo()); 

Если вы хотите «управлять» объявлением, вам придется прибегнуть к BOOST_TYPEOF. Обратите внимание, что оба макроса имеют некоторые варианты, которые вы хотите узнать больше о

1

Звучит как функция для плагина рефакторинга для Eclipse CDT (я на самом деле предложил это своим ученикам некоторое время назад). Может быть, следующий срок я могу найти команду для создания такой. Однако информация Eclipse CDT может быть недостаточно хорошей, чтобы всегда определять правильные вещи.

Для некоторых списков инициаторов, например, для заполнения вектора, boost :: assign может быть заменой. Наша инфраструктура макет-объекта Mockator использует их для C++ 03 вместо списков инициализаций на C++ 11.

Вы не должны бояться библиотек Boost, по крайней мере, не тех, которые входят только в заголовок. Те, у кого есть отдельные части, могут быть небольшими хлопотами для правильной настройки (в последнее время ситуация с улучшением ситуации улучшилась).

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