Проблема
У меня есть следующие две объявления структуры:
template <typename T>
struct Yin {
T *m_ptr;
};
template <typename T>
struct Yang {
T *m_ptr;
};
и я бы хотел найти X
и Y
таким образом, что после замены получим что-то вроде этого:
// Not real C++ syntax
struct Yin<X> {
Yang<Y> *m_ptr;
}
struct Yang<Y> {
Yin<X> *m_ptr;
};
Но я бы хотел сделать это без жесткого кодирования Yin
и Yang
в одном другом определении, поэтому X
будет чем-то вроде Yin<Yang<Yin<Yang<...>>>>
.
Я могу сделать это без аргументов шаблона, например:
struct Yin;
struct Yang;
struct Yin {
Yang *m_ptr;
};
struct Yang {
Yin *m_ptr;
};
Но мой реальный случай использования значительно сложнее, и я бы очень хотел сделать его общим. Кто-нибудь знает, как это сделать? Или, может быть, увидеть что-то очевидное, что мне не хватает?
Я отметил этот вопрос как c++14
, потому что я компилирую соответствующий код с clang с помощью -std=c++1y
, и я счастлив использовать любые возможности С++ 11/С++ 14, чтобы сделать эту работу.
Будущее решение, которое не компилируется.
Вот решение, похожее на то, что оно должно работать, но не компилирует (и дает мне бесполезные сообщения об ошибках):
template <typename T>
struct Yin {
T *m_ptr;
};
template <typename T>
struct Yang {
T *m_ptr;
};
template <template <class> class A, template <class> class B>
struct knot {
using type = A<typename knot<B, A>::type>;
};
template <template <class> class A, template <class> class B>
using Tie = typename knot<A, B>::type;
int main() {
// foo.cc:13:39: error: no type named 'type' in 'knot<Yin, Yang>'
// using type = A<typename knot<B, A>::type>;
// ~~~~~~~~~~~~~~~~~~~~~^~~~
Tie<Yin, Yang> x;
}