
Сделал такую штуку:
Код
class BasePin
{
public:
virtual void On() = 0;
virtual void Off() = 0;
virtual void Cpl() = 0;
...
};
{
public:
virtual void On() = 0;
virtual void Off() = 0;
virtual void Cpl() = 0;
...
};
Это базовый абстрактный класс. Нужен, чтоб можно было передавать ссылку на любую ножку куда угодно. Например, класс TDAC(spi& spiRef, BasePin& CS), конструктору передаётся ссылка на spi и ссылка на ножку чипселекта.
Дальше начинаю городить шаблоны:
Код
template<int port, int pin, char activestate = 'H'> class Pin;
template<int pin>
class Pin<1, pin>: public BasePin
{
public:
virtual void On() { P1OUT |= 1<<pin; }\
...
};
template<int pin>
class Pin<1, pin, 'L'>: public BasePin
{
public:
virtual void On(){ P1OUT &= ~(1<<pin); }
...
};
template<int pin>
class Pin<1, pin>: public BasePin
{
public:
virtual void On() { P1OUT |= 1<<pin; }\
...
};
template<int pin>
class Pin<1, pin, 'L'>: public BasePin
{
public:
virtual void On(){ P1OUT &= ~(1<<pin); }
...
};
И так 5 раз (для портов 1-5). Как-то коряво...
Пробовал так:
Код
template<int port, int pin, char activestate = 'H'>
class Pin: public BasePin
{
public:
virtual void On() {
if (port == 1) P1OUT |= 1<<pin;
if (port == 2) P2OUT |= 1<<pin;
if (port == 3) P3OUT |= 1<<pin;
if (port == 4) P4OUT |= 1<<pin;
if (port == 5) P5OUT |= 1<<pin;
}
...
};
class Pin: public BasePin
{
public:
virtual void On() {
if (port == 1) P1OUT |= 1<<pin;
if (port == 2) P2OUT |= 1<<pin;
if (port == 3) P3OUT |= 1<<pin;
if (port == 4) P4OUT |= 1<<pin;
if (port == 5) P5OUT |= 1<<pin;
}
...
};
Так вроде поменьше писанины, но тоже корявенько.
Теперь внимание, вопрос

Есть ли какая-нибудь возможность получить вот такое:
Код
template<int port, int pin, char activestate = 'H'>
class Pin: public BasePin
{
public:
virtual void On() {P##portOUT |= 1<<pin; }
...
};
class Pin: public BasePin
{
public:
virtual void On() {P##portOUT |= 1<<pin; }
...
};
То есть, хочу нечто вроде макроподстановки. Вроде где-то что-то встречал подобное, но никак не вспомню, куда копать.
ЗЫ. А работает вроде хорошо. То есть,
Код
Pin<1, 2, 'L'> PIN12;
#define PIN_12 1, 2, L
Pin<2, 3> PIN23;
#define PIN_23 2, 3, H
...
PIN12.On();
on(PIN_12);
PIN23.On();
on(PIN_23);
#define PIN_12 1, 2, L
Pin<2, 3> PIN23;
#define PIN_23 2, 3, H
...
PIN12.On();
on(PIN_12);
PIN23.On();
on(PIN_23);
компилится в
Код
1808: e2 c2 21 00 bic.b #4, &0x0021 ;r2 As==10
180c: e2 c2 21 00 bic.b #4, &0x0021 ;r2 As==10
1810: f2 d2 29 00 bis.b #8, &0x0029 ;r2 As==11
1814: f2 d2 29 00 bis.b #8, &0x0029 ;r2 As==11
180c: e2 c2 21 00 bic.b #4, &0x0021 ;r2 As==10
1810: f2 d2 29 00 bis.b #8, &0x0029 ;r2 As==11
1814: f2 d2 29 00 bis.b #8, &0x0029 ;r2 As==11
Накладные расходы - vtable+процедуры на каждую созданную ножку. За это я получаю возможность передавать ссылку на ножку. Я давно этого хотел.
При обращении по ссылке (в TDAC) вызовы уже из vtable, но это для меня приемлемо.