簡體   English   中英

類之間的雙鏈轉換

[英]Doubly chained conversions between classes

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

我想定義任何一對類之間的轉換。

轉換必須遵循系列中類的順序。


例如,從A到C的轉換具有以下步驟:

  1. A轉換為B。
  2. B最終轉換為C

同樣,從C到A的轉換具有以下步驟:

  1. C到B
  2. 企業對企業

我嘗試修改最后一個問題的答案:

沒有公共繼承的類之間的鏈式轉換

但是我只能得到從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.

           ^~~

通過使Aconversion_chain繼承來解決:

struct A : conversion_chain<A, B> { operator B(); };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM