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