Здравствуйте, 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)
{
...
}