Дважды сцепленные преобразования между классами - PullRequest
0 голосов
/ 12 мая 2018

У меня есть серия классов A, B, C, ...

Я хочу определить преобразование между любой парой классов.

Преобразование должно следовать порядку классов в серии.


Например, преобразование из А в С имеет следующие шаги:

  1. A преобразуется в B.
  2. B, наконец, преобразуется в C

Аналогично, преобразование из C в A имеет следующие шаги:

  1. C до B
  2. B до 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.

           ^~~

1 Ответ

0 голосов
/ 12 мая 2018

Исправить, заставляя A наследовать от conversion_chain:

struct A : conversion_chain<A, B> { operator B(); };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...