类之间的双链转换

时间:2018-05-12 18:22:34

标签: c++ oop type-conversion multiple-inheritance

我有一系列的课程A,B,C,......

我想定义任何一对类之间的转换。

转换必须遵循系列中类的排序。

例如,从A到C的转换具有以下步骤:

  1. A转换为B.
  2. B最终转换为C
  3. 同样,从C到A的转换包括以下步骤:

    1. C to B
    2. B to A
    3. 我试着修改我上一个问题的答案:

      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.
      
                 ^~~
      

0 个答案:

没有答案