|
С++ Объявить вариантное перечисление., Шаблонами. |
|
|
|
Jul 1 2013, 10:49
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Есть у меня файл, типа spi.h, в нём - перечисление всех имеющихся SPI: Код enum SpiNum { SPI_1, #if (SPI_COUNT>1) SPI_2, #elif (SPI_COUNT>2) SPI_3 #endif }; Захотелось мне избавиться от дефайнов, и переделать это на шаблоны. Делаю так: Код template<int SPI_Count> struct SpiEnumTraits; template<> struct SpiEnumTraits<1> { enum SpiNum { SPI_1 }; }; template<> struct SpiEnumTraits<2> { enum SpiNum { SPI_1, SPI_2 }; }; template<> struct SpiEnumTraits<3> { enum SpiNum { SPI_1, SPI_2, SPI_3 }; }; template<> struct SpiEnumTraits<4> { enum SpiNum { SPI_1, SPI_2, SPI_3, SPI_4 }; };
typedef typename SpiEnumTraits<chip::spi_count>::SpiNum SpiNum; На саму эту конструкцию компилятор не ругается, а вот на любые упоминания в тексте программы элементов перечисления (SPI_1 и т. д.) - ругается, мол, символ неопределён. Видимо, я что-то делаю неправильно, но вот что?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
 |
Ответов
|
Apr 30 2015, 12:54
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Это некорректный пример, так у меня тоже работает :-) Ведь если "CH_SEL_" затереть, там появится ещё с полсотни вариантов.
У меня, правда, в обратном порядке всё работает - проект конфигурируется галками, и эклипс сам генерирует make-файлы. Какой-то супер-гибкости мне не надо, а потешить самолюбие (я тут всё контролирую!) и так можно - make-файлы лежат себе на видном месте.
Я просто думал, что есть какая-то галка, чтобы эклипс подставлял для enum'а только значения, которые в нём разрешены. Ну, нет так нет...
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Apr 30 2015, 20:01
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(esaulenka @ Apr 30 2015, 17:54)  Это некорректный пример, так у меня тоже работает :-) Ведь если "CH_SEL_" затереть, там появится ещё с полсотни вариантов. У меня нет никаких полусотни вариантов  CH_SEL_ Появляется само, потому что это общая часть среди всех имеющихся вариантов. То есть, если я напишу вот так: Код #include "stm32_dma.h"
void Test() { typedef STM32::DMA::Dma1Channel1 DmaCh; DmaCh::SelectChannel(DmaCh::ChannelSelection:: } , помещу курсор после двоеточия, и нажму Ctrl+Space, то эклипса сама дописывает "CH_SEL_", и выдаёт строго то, что нужно. Если не нажимать Ctrl+Space, а немного подождать, то CH_SEL_ не появляется, и варианты выдаются целиком. Но тоже строго те, которые надо. Вот, записал мультик:
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
Сообщений в этой теме
AHTOXA С++ Объявить вариантное перечисление. Jul 1 2013, 10:49 neiver Если строчка:
typedef typename SpiEnumTraits<ch... Jul 1 2013, 17:40 AHTOXA Это я уже от безысходности добавил. И без typename... Jul 1 2013, 18:50 XVR Цитата(AHTOXA @ Jul 1 2013, 14:49) Делаю ... Jul 2 2013, 08:29 AHTOXA Так я тоже пробовал, и это тоже не работает:
Кодif... Jul 2 2013, 08:49  XVR Цитата(AHTOXA @ Jul 2 2013, 12:49) Так я ... Jul 2 2013, 08:51   AHTOXA А, пардон, я невнимательно прочитал. Да, так работ... Jul 2 2013, 09:10 Tahoe Цитата(AHTOXA @ Jul 1 2013, 14:49) Кодenu... Jul 5 2013, 19:29 AHTOXA Недавно вернулся к этой теме, но немного по другом... Apr 11 2015, 07:25  esaulenka Цитата(AHTOXA @ Apr 11 2015, 10:25) Недав... Apr 30 2015, 10:33   AHTOXA Цитата(esaulenka @ Apr 30 2015, 15:33) Во... Apr 30 2015, 11:08 Сергей Борщ Интересно, взял на заметку. Apr 11 2015, 08:08 shreck ОФФ.
А мне вот интересно, IAR будет воплощать у се... Apr 20 2015, 10:16 esaulenka С автодополнением я понял, почему у меня не работа... May 7 2015, 12:58 AHTOXA Цитата(esaulenka @ May 7 2015, 17:58) Что... May 7 2015, 18:39 esaulenka О, спасибо большое.
Хватило одной __cxa_pure_virtu... May 8 2015, 06:47
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|