Здравствуйте, ollv, Вы писали:
O> раскрой суть автогенеренных классов. Если классы нельзя модифицировать(код класса), т.е. сторонняя библиотека тот-же трюк можно проделать через внешний аксессор O> автоматизировать построение таких аксессоров на пребилдевете в студии. И с полями можно будет работать как с обычным списком значений... или нельзя модифицировать из-за константности — тогда реализовать конструктор принимающий мультитайплист
Модифицировать авто-генерённые классы -- себя не любить. Они же могут и перегенериться.
Твой подход по сути эквивалентен type traits, только немного более нестандартный. Пока что я реализовал все используя простые рабоче-крестьянские type traits, но хотелось бы найти общее решение, чтобы поддержка новых классов не требовала добавления нового кода.
Здравствуйте, Cruelty, Вы писали:
C>Oops. There is a problem though, that the code fails to compile, when a class does not have a member with that name at all ...
Вот рабочий код для VC9. g++ ругается, надо причесывать. ICL лажает.
#include <iostream>
#include <string>
struct Yes{int i;};
struct No{Yes i[10];};
template< typename T,typename R > No Helper(...){return No();}
template< typename T,typename R > Yes Helper(R (T::*)){return Yes();}
struct Dummy{};
template<int i>
struct X
{
typedef Dummy type;
};
template<>
struct X<sizeof(Yes)>
{
typedef int* type;
};
template<typename T,typename R> No Finder(...){return No();}
template<typename T,typename R> Yes Finder(typename X<sizeof(Helper<T,R>(&T::b))>::type p){return Yes();}
struct A { int b; };
struct B { };
struct C { B b; };
struct D { double* b; };
int main()
{
std::cout << (sizeof(Finder<A,int>(0))==sizeof(Yes)) << std::endl;
std::cout << (sizeof(Finder<B,int>(0))==sizeof(Yes)) << std::endl;
std::cout << (sizeof(Finder<C,B>(0))==sizeof(Yes)) << std::endl;
std::cout << (sizeof(Finder<D,double*>(0))==sizeof(Yes)) << std::endl;
}
Суть всего этого упражнения для меня определить существует ли член класса с определённым именем и определенного типа. Этакая интроспекция автогенерённых классов.
И ещё один вопрос, может кто знает существует ли способ написать такой Helper класс:
struct A;
struct B
{
A* a;
};
Helper<B>::type is the same as struct A
У меня как-то совсем никаких идей нет как это сделать...
Здравствуйте, Cruelty, Вы писали:
C>Здравствуйте, ollv, Вы писали:
O>> это должно работать для любого призвольного класса? или допускаются вспомогательные метаданные, если второе то у меня получалось
C>Here I know type B and member name a. I want to deduce type A. C>Any solution is more than welcome as at the very least it may bring some fresh ideas to consideration. Cheers
So.. this sample with macros using realization in vc
But i don't have compiler in home, then i quick write but, don't compile this primitive sample ..but, this tehnology worked for auto binding iterabled fields , half step on hybernate in c++ and etc ^))
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, Cruelty, Вы писали:
C>Здравствуйте, ollv, Вы писали:
O>>struct registered_tag{}; -флаг зареганности филды
C>Это, к сожалению, немного не то. Суть в том, что мне нельзя модифицировать автогенерированные классы, поетому регистрацию членов класса не получится сделать.
раскрой суть автогенеренных классов. Если классы нельзя модифицировать(код класса), т.е. сторонняя библиотека тот-же трюк можно проделать через внешний аксессор
template <typename _Ty>
struct _Accessor;
class A { public: int m_A; };
//псевдокодtemplate<>
struct _Accessor<A>
{
...
decl_field(int, &A::m_A);
};
автоматизировать построение таких аксессоров на пребилдевете в студии. И с полями можно будет работать как с обычным списком значений... или нельзя модифицировать из-за константности — тогда реализовать конструктор принимающий мультитайплист
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Cruelty, Вы писали:
К>Прекрасно! Очередной баг в VC. К>VC8 вываливается в ICE, если ему разжевать по буквам и подсунуть вот такой код К>
Здравствуйте, Cruelty, Вы писали:
C>Суть всего этого упражнения для меня определить существует ли член класса с определённым именем и определенного типа. Этакая интроспекция автогенерённых классов.
C>И ещё один вопрос, может кто знает существует ли способ написать такой Helper класс: C>
C>struct A;
C>struct B
C>{
C> A* a;
C>};
C>Helper<B>::type is the same as struct A
C>
C>У меня как-то совсем никаких идей нет как это сделать...
Было дело, с похожим "уравнением" я пыли наглотался, убил уйму времени... короче, у меня не получилось
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Cruelty, Вы писали:
C>Суть всего этого упражнения для меня определить существует ли член класса с определённым именем и определенного типа. Этакая интроспекция автогенерённых классов.
C>И ещё один вопрос, может кто знает существует ли способ написать такой Helper класс: C>
C>struct A;
C>struct B
C>{
C> A* a;
C>};
C>Helper<B>::type is the same as struct A
C>
C>У меня как-то совсем никаких идей нет как это сделать...
это должно работать для любого призвольного класса? или допускаются вспомогательные метаданные, если второе то у меня получалось
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, ollv, Вы писали:
O> это должно работать для любого призвольного класса? или допускаются вспомогательные метаданные, если второе то у меня получалось
Here I know type B and member name a. I want to deduce type A.
Any solution is more than welcome as at the very least it may bring some fresh ideas to consideration. Cheers
Здравствуйте, ollv, Вы писали:
O>Здравствуйте, Cruelty, Вы писали:
C>>Здравствуйте, ollv, Вы писали:
O>>> это должно работать для любого призвольного класса? или допускаются вспомогательные метаданные, если второе то у меня получалось
C>>Here I know type B and member name a. I want to deduce type A. C>>Any solution is more than welcome as at the very least it may bring some fresh ideas to consideration. Cheers O>So.. this sample with macros using realization in vc O>
O> But i don't have compiler in home, then i quick write but, don't compile this primitive sample ..but, this tehnology worked for auto binding iterabled fields , half step on hybernate in c++ and etc ^))
struct registered_tag{}; -флаг зареганности филды
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, ollv, Вы писали:
O>struct registered_tag{}; -флаг зареганности филды
Это, к сожалению, немного не то. Суть в том, что мне нельзя модифицировать автогенерированные классы, поетому регистрацию членов класса не получится сделать.
Здравствуйте, Cruelty, Вы писали:
C>Суть всего этого упражнения для меня определить существует ли член класса с определённым именем и определенного типа. Этакая интроспекция автогенерённых классов.
C>И ещё один вопрос, может кто знает существует ли способ написать такой Helper класс: C>
C>struct A;
C>struct B
C>{
C> A* a;
C>};
C>Helper<B>::type is the same as struct A
C>
C>У меня как-то совсем никаких идей нет как это сделать...
Please correct me if I am wrong, but this seems to verify whether a class derived from another class, rather then deduce the type of class' member by its name.
Also, isn't this fuctionality available in boost.TypeTraits library (is_base_of/is_same)?
Здравствуйте, Cruelty, Вы писали:
C>Здравствуйте, Caracrist,
C>Please correct me if I am wrong, but this seems to verify whether a class derived from another class, rather then deduce the type of class' member by its name.
C>Also, isn't this fuctionality available in boost.TypeTraits library (is_base_of/is_same)?
Да, не поинтересовался. Дают тот же результат.
Учитывая то, что тебе об этом известно, я, скорее всего, не правильно понял вопрос.
Здравствуйте, Cruelty, Вы писали:
C>Здравствуйте, ollv, Вы писали:
O>> раскрой суть автогенеренных классов. Если классы нельзя модифицировать(код класса), т.е. сторонняя библиотека тот-же трюк можно проделать через внешний аксессор O>> автоматизировать построение таких аксессоров на пребилдевете в студии. И с полями можно будет работать как с обычным списком значений... или нельзя модифицировать из-за константности — тогда реализовать конструктор принимающий мультитайплист
C>Модифицировать авто-генерённые классы -- себя не любить. Они же могут и перегенериться.
C>Твой подход по сути эквивалентен type traits, только немного более нестандартный. Пока что я реализовал все используя простые рабоче-крестьянские type traits, но хотелось бы найти общее решение, чтобы поддержка новых классов не требовала добавления нового кода.
да если не автоматизировать постгенерейт на пребилд евенте(или автогенерация происходит по-другому?), то это будет проблемой
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, Cruelty, Вы писали:
C>Oops. There is a problem though, that the code fails to compile, when a class does not have a member with that name at all ...
Ничего не поделаешь. Баг в алгоритме унификации типа вида R (T::*). Для метода-члена работает R (T::*)(),просто для R (T::*) данных нет.
Вот код основанный на немного другой идее — результат тот же.
#include <iostream>
template<class T,class R, R (T::* t)()=&T::member>
class member_bind
{
public:
typedef T type;
};
template<class T1,class R, class T2>
class has_member
{
public:
static const bool value = false;
};
template<class T,class R>
class has_member<T,R,typename member_bind<T,R>::type>
{
public:
static const bool value = true;
};
struct X{};
class A
{
public:
X member();
};
class B {};
class C
{
public:
int member();
};
int main(int argc, char* argv[])
{
std::cout << "A has member? " << (has_member<A,X,A>::value ? "yes" : "no") << std::endl;
std::cout << "B has member? " << (has_member<B,X,B>::value ? "yes" : "no") << std::endl;
std::cout << "C has member? " << (has_member<C,int,C>::value ? "yes" : "no") << std::endl;
return 0;
}