Как на выбор использовать вложенный тип или внешний?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 18.01.10 11:36
Оценка:
Здравствуйте, коллеги!

Вопрос такой. Сейчас используются вложенные типы примерно так:
struct CStructA
{
...
struct metaData
{
...
};
};

// сейчас это не требуется
// но это можно добавить в существующие исходники
typedef CStructA::metaData metaDataForStructA; 

// шаблонная функция, которую хочется модернизировать
template <typename STRUCT>
STRUCT::metaData getMetaData( const STRUCT &s)
...


Сейчас возникло желание делать так:
struct CStructB
{
...
};

struct metaDataForStructB
{
...
};


Т.е хочется отделить описание meta data от самих данных, с тем чтобы описывать и чужие данные, изменять чужие исходники в общем случае нельзя, с другой стороны, первый вариант уже много где используется и ломать его тоже не хочется. Как бы извратится и написать шаблон getMetaData?
Маньяк Робокряк колесит по городу
Re: Как на выбор использовать вложенный тип или внешний?
От: Chorkov Россия  
Дата: 18.01.10 11:51
Оценка: 4 (1) +1
Здравствуйте, 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)
{
...
}
Re: Как на выбор использовать вложенный тип или внешний?
От: Bell Россия  
Дата: 18.01.10 11:52
Оценка: 4 (1) +1
Здравствуйте, 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;
}
Любите книгу — источник знаний (с) М.Горький
Re: Как на выбор использовать вложенный тип или внешний?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 18.01.10 12:18
Оценка:
Здравствуйте, коллеги!

Спасибо, в общем идея понятна: сделать шаблонный traits класс и использовать его для имеющихся структур с вложенным типом, а для описания внешнего типа специализировать этот traits.
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.