我有一系列的课程A,B,C,......
我想定义任何一对类之间的转换。
转换必须遵循系列中类的排序。
例如,从A到C的转换具有以下步骤:
同样,从C到A的转换包括以下步骤:
我试着修改我上一个问题的答案:
Chained conversion between classes without public inheritances
但是我只能从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.
^~~