Здравствуйте, коллеги!
Вопрос такой. Сейчас используются вложенные типы примерно так:
struct CStructA
{
...
struct metaData
{
...
};
};
// сейчас это не требуется
// но это можно добавить в существующие исходники
typedef CStructA::metaData metaDataForStructA;
// шаблонная функция, которую хочется модернизировать
template <typename STRUCT>
STRUCT::metaData getMetaData( const STRUCT &s)
...
Сейчас возникло желание делать так:
struct CStructB
{
...
};
struct metaDataForStructB
{
...
};
Т.е хочется отделить описание meta data от самих данных, с тем чтобы описывать и чужие данные, изменять чужие исходники в общем случае нельзя, с другой стороны, первый вариант уже много где используется и ломать его тоже не хочется. Как бы извратится и написать шаблон getMetaData?
Здравствуйте, Marty, Вы писали:
M> Здравствуйте, коллеги!
M>Вопрос такой. Сейчас используются вложенные типы примерно так:
M>M>struct CStructA
M>{
M>...
M>struct metaData
M>{
M>...
M>};
M>};
M>// сейчас это не требуется
M>// но это можно добавить в существующие исходники
M>typedef CStructA::metaData metaDataForStructA;
M>// шаблонная функция, которую хочется модернизировать
M>template <typename STRUCT>
M>STRUCT::metaData getMetaData( const STRUCT &s)
M>...
M>
M>Т.е хочется отделить описание meta data от самих данных, с тем чтобы описывать и чужие данные, изменять чужие исходники в общем случае нельзя, с другой стороны, первый вариант уже много где используется и ломать его тоже не хочется. Как бы извратится и написать шаблон getMetaData?
A)
struct metaDataForStructB
struct CStructB
{
typedef metaDataForStructB metaData;
...
};
struct metaDataForStructB
{
...
};
B)
template<class C>
struct metaData<C> { typedef typename C::metaData type; };
struct CStructA
{
struct metaData;
...
};
struct CStructB
{
...
};
// Для классов, которые не поддерживали флаг metaData внутри себя, но для которых их нужно добавлять,
// пишем реализацию сами:
struct metaData<CStructB> { typedef metaDataForStructB type; };
//////////////////////////////////////
template <typename STRUCT>
typename metaData<STRUCT>::type getMetaData( const STRUCT &s)
{
...
}
Здравствуйте, Marty, Вы писали:
Простейший вариант — использовать traits-ы:
struct A
{
struct metaData {};
};
struct B {};
struct metaDataB {};
template <typename STRUCT>
struct traits_type
{
typedef typename STRUCT::metaData metaData;
};
template<>
struct traits_type <B>
{
typedef metaDataB metaData;
};
template <typename STRUCT>
typename traits_type<STRUCT>::metaData getMetaData( const STRUCT &s)
{
//...
}
int main()
{
getMetaData(A());
getMetaData(B());
return 1;
}