如何实现有序类系列的双向链式类型转换?
解决双向链式类型转换问题
你的问题出在只有部分类继承了转换链逻辑,导致单向转换能工作,反向不行。具体来说:C能转A是因为C继承了conversion_chain<C,B>,可以先转成B再转成A;但A没有继承任何转换链,它只能直接转成B,编译器没法自动帮你把B的结果继续转成C。
下面是修改后的完整代码,能实现双向链式转换:
#include <type_traits> #include <iostream> template <typename T1, typename T2> struct conversion_chain { // 调整条件:检查T2能否转换为T,同时避免自己转自己的递归 template <typename T, typename = std::enable_if_t< std::is_convertible_v<T2, T> && !std::is_same_v<T1, T>>> operator T() const { // 先把当前对象转成中间类型T2,再从T2转成目标类型T return static_cast<const T2&>(static_cast<const T1&>(*this)); } }; struct B; struct C; // A继承转换链,借助B的能力实现后续转换 struct A : conversion_chain<A, B> { operator B() const; }; struct B : conversion_chain<B, A>, conversion_chain<B, C> { operator A() const; operator C() const; }; struct C : conversion_chain<C, B> { operator B() const; }; A::operator B() const { std::cout << "A -> B\n"; return B(); } B::operator A() const { std::cout << "B -> A\n"; return A(); } B::operator C() const { std::cout << "B -> C\n"; return C(); } C::operator B() const { std::cout << "C -> B\n"; return B(); } int main() { A a = C(); // 输出:C -> B -> A C c = A(); // 输出:A -> B -> C return 0; }
关键调整说明
- 给A添加转换链继承:让
A继承conversion_chain<A,B>,这样当需要把A转成C时,转换链会先把A转成B,再利用B的operator C()完成最终转换。 - 修正转换链的逻辑:
- 用
std::is_convertible_v<T2, T>替代原来的std::is_constructible_v,因为我们需要的是类型转换能力,而非构造函数匹配。 - 增加
!std::is_same_v<T1, T>避免类型转换自己导致的递归问题。
- 用
- 转换运算符改为const:这是更规范的写法,让const对象也能支持转换操作,同时保持逻辑一致性。
现在双向链式转换都能正常编译运行,完全符合你要求的顺序规则。
内容的提问来源于stack exchange,提问作者R zu
相关产品推荐
相关产品推荐

