Цитата(Waso @ Nov 6 2009, 23:07)

Сначала было так:
Код
template<GPIO_mode_t mode, char port, int bit, char activestate>
...
Ну и нормально

Только
#if defined (PORTA) - лишнее, ибо не будет вызываться, пока вы не определите Pin<'A'...>. В этом прелесть шаблонов

Цитата
Потом пытался уменьшить количество писанины в части ссылок на регистры:
Код
template<char port> class Base_Pin;
...
template<GPIO_mode_t mode, char port, int bit, char activestate>
class Pin2 : public Base_Pin<port>
...
От наследования тут мало толку, всё равно приходится указывать имя базового класса.
Здесь удобнее определить включаемый класс, типа
Код
// объявление шаблона регистров порта:
template<char port>struct port_regs_t;
// специализация для каждого порта:
template <> struct port_regs_t<'A'>
{
inline volatile uint8_t & PORTx(){return PORTA;}
...
};
...
// и наконец, собственно шаблон ноги:
template<GPIO_mode_t mode, char port, int bit, char activestate>
class Pin2
{
private:
typedef port_regs_t<port> regs_t;
public:
typename regs_t::PORTx PORTx;
typename pins_t::DDRx DDRx;
typename pins_t::PINx PINx;
...
};
В варианте для MSP430 (а именно на него я давал ссылку

) у меня примерно так и сделано. А вы, похоже, смотрели вариант для stm32?
Цитата
И да кстати. Я так и не понял в чем вкусность переопределения операторов в примере Антона.
Дык, просто что-то не сложилось со ссылками (или просто не догадался). Потому пришлось определять все операции. Если работает со ссылками, то так конечно лучше. Надо будет попробовать...
И, кстати, одно замечание по параметрам. Имхо, включать режим работы ножки (GPIO_mode_t) в перечень параметров шаблона - идеологически неверно. Потому что иногда случается, что режим работы ноги надо переключать на ходу.
Если бы я знал, что такое электричество...