You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现有序类系列的双向链式类型转换?

解决双向链式类型转换问题

你的问题出在只有部分类继承了转换链逻辑,导致单向转换能工作,反向不行。具体来说: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;
}

关键调整说明

  1. 给A添加转换链继承:让A继承conversion_chain<A,B>,这样当需要把A转成C时,转换链会先把A转成B,再利用B的operator C()完成最终转换。
  2. 修正转换链的逻辑:
    • 用std::is_convertible_v<T2, T>替代原来的std::is_constructible_v,因为我们需要的是类型转换能力,而非构造函数匹配。
    • 增加!std::is_same_v<T1, T>避免类型转换自己导致的递归问题。
  3. 转换运算符改为const:这是更规范的写法,让const对象也能支持转换操作,同时保持逻辑一致性。

现在双向链式转换都能正常编译运行,完全符合你要求的顺序规则。

内容的提问来源于stack exchange,提问作者R zu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:02:32