У меня есть серия классов A, B, C, ...
Я хочу определить преобразование между любой парой классов.
Преобразование должно следовать порядку классов в серии.
Например, преобразование из А в С имеет следующие шаги:
- A преобразуется в B.
- B, наконец, преобразуется в C
Аналогично, преобразование из C в A имеет следующие шаги:
- C до B
- B до A
Я пытаюсь изменить ответ на мой последний вопрос:
Цепное преобразование между классами без публичного наследования
Но я могу получить только цепное преобразование из C в A.
Цепные преобразования в обратном направлении не работают.
Как заставить работать цепные преобразования в обоих направлениях?
Тест (также на godbolt.org )
#include <type_traits>
#include <iostream>
template <typename T1, typename T2>
struct conversion_chain {
template <typename T, typename = std::enable_if_t<
std::is_constructible_v<T, T2>
>>
operator T() {
return static_cast<T1 *>(this)->operator T2();
}
};
struct B;
struct C;
struct A { operator B(); };
struct B : conversion_chain<B, A>, conversion_chain<B, C> {
operator A();
operator C();
};
struct C : conversion_chain<C, B> {
operator B();
};
A::operator B() {
std::cout << "A -> B\n";
return B();
}
B::operator A() {
std::cout << "B -> A\n";
return A();
}
B::operator C() {
std::cout << "B -> C\n";
return C();
}
C::operator B() {
std::cout << "C -> B\n";
return B();
}
int main() {
A a = C();
C c = A(); // This line does not compile.
return 0;
}
Ошибка компиляции:
<source>:49:11: error: conversion from 'A' to non-scalar type 'C' requested
C c = A(); // This line does not compile.
^~~