Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
struct Interface
{
void getIds(unsigned& id0, unsigned& id1) = 0;
};
struct HasMainId0
{
unsigned id0;
};
struct HasMainId1: public HasMainId0
{
unsigned id1;
};
struct HasAnotherId
{
unsigned anotherId;
}
struct Data1: HasMainId0 {};
struct Data2: HasMainId1 {};
struct Data3: HasAnotherId {};
struct Data4: HasMainId0, HasAnotherId {};
template<typename T>
struct DynamicData: public Interface, public T
{
void getIds(unsigned& id0, unsigned& id1);
}
typedef DynamicData<Data1> DynamicData1;
typedef DynamicData<Data2> DynamicData2;
typedef DynamicData<Data3> DynamicData3;
typedef DynamicData<Data4> DynamicData4;
template<typename T, typename F>
struct GetterIds
{
void operator()( const T& val, unsigned& id0, unsigned& id1 );
};
void selector(... );
HasMainId0 selector(HasMainId0*, ... );
HasMainId0 selector(HasMainId0*, HasAnotherId* );
HasAnotherId selector(HasAnotherId*, ... );
HasMainId1 selector(HasMainId1*, ... );
Общая архитектура досталась в наследствоТ.е. предложенный метод в какой-то степени является замысловатым костылем.
Т.е. предложенный метод в какой-то степени является замысловатым костылем.
struct HasAnotherId
{
virtual void getIds(unsigned& id0, unsigned& id1)
{
id0 = HasAnotherId::anotherId; id1=0xFFFFFFFF;
}
}
struct HasMainId0 : public HasAnotherId
{
virtual void getIds(unsigned& id0, unsigned& id1)
{
id0 = HasMainId0::id0; id1=0xFFFFFFFF;
}
}
struct HasMainId1: public HasMainId0
{
virtual void getIds(unsigned& id0, unsigned& id1)
{
id0 = HasMainId0::id0; id1=HasMinaId1::id1;
}
}
struct NoIds
{
virtual void getIds(unsigned& id0, unsigned& id1)
{
id0 = 0xFFFFFFFF; id1=0xFFFFFFFF;
}
}
Executor<T, sizeof( selector( (T*) 0, (T*) 0 ) )>()( v );По мне так больше похоже на regexp чем на C++. Представьте кто-то кроме вас попробует разобраться? Вы тогда в комменты к коду эту статью добавьте :)selector
Executor<T, sizeof( selector( v, v ) )>()( v );
template<class T>
typename std::enable_if<std::is_base_of<Base1,T>::value,void>::type
execute(const T&);
template<class T>
typename std::enable_if<std::is_base_of<Base2,T>::value,void>::type
execute(const T&);
typename std::enable_if<
std::is_base_of<Base1,T>::value && !std::is_base_of<Base2,T>::value
>::type
Специализация шаблона базовым классом