LINUX.ORG.RU

Нет.

Функция преобразования должна быть нестатической функцией-членом класса...

fsb4000 ★★★★★
()
Ответ на: комментарий от bonta

А есть ли возможность заделать автоматическое преобразование из одного типа в другой, не внося изменения в исходные классы? Исходные классы это typedef от шаблонных классов, и для двух вариантов из них хотелось бы автоматическую конвертацию, не трогая другие. Наследовать и специализировать эти определения не хочется, т.к. получится много не красивого кода.

victor79
() автор топика
Ответ на: комментарий от victor79

Технически можно вынести, но имхо это не совсем правильно с точки зрения инкапсуляции, и возможно всеравно придется снабжать классы методами для «общения» через кастование

class B;
class A
{
public:
    A()=default;
    A(B);
};

class B {
public:
    B()=default;
    B(A){}
};
A::A(B){}

template <class TO, class FROM> TO class_cast(FROM from){
    //путь при котором котором A и B не знают друг о друге
    //заставит в этой шаблонной фии писать много кода
    //и возможно делать её френдом классов или усложнять интерфейс классов
    //например
    //type1 t1 = from.get_t1();
    //type2 t2 = from.get_t2();
    //t1.somefunc(t2)
    //а в итоге мы придем к тому что напишем
    //return TO(t1)

    //т.е. в итоге было б проще (имхо, я не особо эксперт)
    //инкапсулировать в конструкторы преобразования все это дело
    //тогда было б красиво:
    return TO(from);
}
....
B b;
A a = class_cast<A>(b);

bonta ★★★★★
()
Ответ на: комментарий от bonta

т.е. сделать имхо конструктор преобразования для каждого класса A(const B &b){и тут взять нужное из b} и т.д. Как вариант

bonta ★★★★★
()
Ответ на: комментарий от bonta

тогда и class_cast не нужен кстати будет, если будут такие конструкторы

bonta ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.