Re: вопрос по метапрограммированию
От: crable США  
Дата: 18.10.05 05:01
Оценка:
Здравствуйте, CyberZX, Вы писали:

CZX>допустим есть у нас набор шаблонных классов, которые наследуют от своего параметра

CZX>

CZX>из них я хочу сгенерировать класс, имеющий сложную иерархическую структуру

CZX>

CZX>вроде все хорошо. но проблема вот в чем. у меня в дереве MyStruct имеется два различных класса A, которые все же имеют функцию foo с одинаковой сигнатурой. поэтому я не могу просто вызвать my_struct.foo() из-за возникающей неоднозначности.


CZX>меня интересует, есть ли какие-нибудь известные методы для того, что бы как-нибудь помечать конкретные классы в иерархии и потом получать к ним доступ? естесственно интересует только compile-time, в run-time все далется тривиально через dynamic_cast

CZX>а мне бы хотелось как-нибудь вот так tag_cast<first_A_class_tag>(my_struct).foo(); tag_cast<second_A_class_tag>(my_struct).foo();
CZX>что-то пока никакое решение в голову не приходит
Может так?
struct E {};

template <typename T>
struct A: public T
{
        void foo() { cout << "A<T>::foo()\n"; }
};
// специализация просто, чтобы показать вызов foo из A<E>
template <>
void A<E>::foo() { cout << "A<E>::foo()\n"; }

template <typename T>
struct B: public T {};

template <typename T, typename U>
struct C: public T, public U {};

struct M: public A<C<B<E>, A<E> > >
{
        void foo1() { A<C<B<E>, A<E> > >::foo(); }
        void foo2() { A<E>::foo(); }
};
  
int main()
{
        M        m;
        m.foo1();
        m.foo2();
  
        return 0;
}
The last good thing written in C was Franz Schubert's Symphony No. 9.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.