Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
DEFINE_ENUM_WITH_DEFAULT_VALUE( EHumanizationMode, eCppCode,
( ( eDisabled ) )
( ( eCppCode ) )
( ( eAutoexpCode ) ) );
//
// CodeFactory: BEGIN Auto generated preprocessed code
//
class EHumanizationMode : public ISmartEnumBase
{
private: template< class T > operator T() const;
template< class T >
operator T();
public: enum EImpl
{
eDisabled, eCppCode, eAutoexpCode
};
private: EImpl m_eValue;
public: inline EHumanizationMode( EImpl m_eValue ) : m_eValue( m_eValue )
{
}
public: inline bool operator==( const EHumanizationMode &rEnum ) const
{
return m_eValue == rEnum.m_eValue;
}
inline bool operator==( const EImpl oValue ) const
{
return m_eValue == oValue;
}
template< class T >
inline bool operator!=( const T &rValue ) const
{
return !( *this == rValue );
}
public: inline operator EImpl() const
{
return m_eValue;
}
inline operator EImpl&()
{
return m_eValue;
}
public: inline int ToInt() const
{
return reinterpret_cast< const int & >( m_eValue );
}
inline int &ToInt()
{
return reinterpret_cast< int & >( m_eValue );
}
const char *ToString() const
{
switch( m_eValue )
{
case EHumanizationMode::eDisabled : return "EHumanizationMode::eDisabled";
case EHumanizationMode::eCppCode : return "EHumanizationMode::eCppCode";
case EHumanizationMode::eAutoexpCode : return "EHumanizationMode::eAutoexpCode";
default: ((void)0);
abort();
return "Error";
};
}
static EHumanizationMode FromInt( int eValue )
{
((void)0);
EHumanizationMode oRes;
oRes.ToInt() = eValue;
return oRes;
}
static bool ValidateValue( const int eValue )
{
switch( eValue )
{
case EHumanizationMode::eDisabled : case EHumanizationMode::eCppCode : case EHumanizationMode::eAutoexpCode : return true;
default: return false;
};
}
public: inline EHumanizationMode() : m_eValue( eCppCode )
{
}
};;
//
// CodeFactory: END Auto generated preprocessed code
//
#define END_MODEL_TYPE \
}; void TModelTypeReflection::RegisterTypes() {
безопасно?#define START_ME <some code here>
#define END_ME }; someOtherCode {
struct MyStruct
{
START_ME
<...>
END_ME
}
struct MyStruct
{
START_ME
<...>
END_ME
int iWasAddedLater;
}
Альтернативное решение, позволяющее объединить объявление с реализацией — использование кодогенератора, но и этот подход тоже имеет свои недостатки.
Магия макросов для объединения объявления и реализации