Я пробовал эту игру без везения, поэтому я здесь пытаюсь.
У меня есть пара классов, каждый из которых определяет член struct foo
. Этот тип элемента foo
сам может наследовать один из предыдущих классов, следовательно, сам получить тип элемента foo
.
Я хочу получить доступ к вложенным типам foo
с использованием метапрограммирования шаблонов (см. ниже), но сглаживание имени С++ вводит проблемы, так как верхнее имя типа foo
вводится в нижний тип foo
, а верхний разрешается, когда я хочу получить доступ к нижнему, скажем, используя A::foo::foo
.
Вот пример:
#include <type_traits>
struct A;
struct B;
struct A {
struct foo;
};
struct B {
struct foo;
};
struct A::foo : B { };
struct B::foo : A { };
// handy c++11 shorthand
template<class T>
using foo = typename T::foo;
static_assert( std::is_same< foo< foo< A > >, foo< B > >::value,
"this should not fail (but it does)" );
static_assert( std::is_same< foo< foo< A > >, foo< A > >::value,
"this should fail (but it does not)" );
FYI, я реализую производные функции, foo
- тип производной. Вышеупомянутая ситуация происходит, например, с sin/cos.
TL;DR: как мне получить foo<foo<A>>
как foo<B>
, а не foo<A>
?
Спасибо!