Я попытался немного изменить решение ybungalobill, считая мои собственные потребности. И это то, что я получил
template<class T>
struct TBootBootParams_traits;
template <class T>
struct TBootBootParams
{
typedef TBootBootParams_traits<T> Traits;
typename Traits::TransType transferType;
typename Traits::UseAbort_ useAbort;
bool GetImmediate()
{
if ( transferType == TBootBootParams_traits<T>::e1 )
{
return useAbort.someFlag;
}
return false;
}
};
struct BootBootParams;
struct BootAltBootParams;
template<>
struct TBootBootParams_traits<BootBootParams>
{
enum SomeEnum
{
e1=5,
e2,
e3
};
struct UseAbort
{
bool someFlag;
long long someMember;
long long otherMember;
};
typedef SomeEnum TransType;
typedef UseAbort UseAbort_;
};
template<>
struct TBootBootParams_traits<BootAltBootParams>
{
enum SomeEnum
{
e1=5,
e2,
e3
};
struct UseAbort
{
bool someFlag;
int someMember;
float otherMember;
};
typedef SomeEnum TransType;
typedef UseAbort UseAbort_;
};
struct BootBootParams :
public TBootBootParams<BootBootParams>
{
};
struct BootAltBootParams :
public TBootBootParams<BootAltBootParams>
{
};
int main(void)
{
BootBootParams bp;
BootAltBootParams bpa;
bool f = bp.GetImmediate();
f = bpa.GetImmediate();
}
Подводя итог .. Я использую шаблонный класс как обязательный параметр другого класса для этого класса, размещая там все данные типа. Это как раз то, что мне было нужно. Еще раз спасибо за вариант!