[英]Doubly chained conversions between classes
我有一系列的A,B,C等課程...
我想定義任何一對類之間的轉換。
轉換必須遵循系列中類的順序。
例如,從A到C的轉換具有以下步驟:
同樣,從C到A的轉換具有以下步驟:
我嘗試修改最后一個問題的答案:
但是我只能得到從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.
^~~
通過使A
從conversion_chain
繼承來解決:
struct A : conversion_chain<A, B> { operator B(); };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.