// associate a tag and its type
template<int I> struct TagInfo {
typedef RasTag<I> Tag;
typedef typename RasType<I>::Type Type;
enum {
tag = I,
// there are just 32 types of RAS, lucky!
flag = (1 << I)
};
};
// a dirty trick, but works :p
template<int I> struct RequestInfo : public TagInfo<I> {
typedef RasTag<I+1> ConfirmTag;
typedef RasTag<I+2> RejectTag;
typedef typename RasType<I+1>::Type ConfirmType;
typedef typename RasType<I+2>::Type RejectType;
};
class SimplePasswordAuth : public GkAuthenticator
{
public:
enum SupportedRasChecks {
/// bitmask of RAS checks implemented by this module
SimplePasswordAuthRasChecks = RasInfo<H225_GatekeeperRequest>::flag
| RasInfo<H225_RegistrationRequest>::flag
| RasInfo<H225_UnregistrationRequest>::flag
| RasInfo<H225_BandwidthRequest>::flag
| RasInfo<H225_DisengageRequest>::flag
| RasInfo<H225_LocationRequest>::flag
| RasInfo<H225_InfoRequest>::flag
| RasInfo<H225_AdmissionRequest>::flag
};
// .....
};
Специализация шаблонов делалась из еще одного enum'а, который сидит в сорцах протокола H.323, так что в результате на выходе для каждой специализации RasInfo<T> получалось свое значение flag, непересекающееся с другими специализациями.
ЗЫ: Да, оформление сайта я скоро поменяю, а то код сюда кидать как-то неинтересно стало.