Неявное преобразование между сторонними типами - PullRequest
1 голос
/ 11 марта 2010

Есть два класса: A и B. Существуют алгоритмы преобразования из типа A в тип B и обратно. Мы не можем коснуться их исходного кода. Могу ли я написать неявное преобразование между двумя типами?

Пример кода, который должен работать:

B CalculateSomething(double x)
{
    A a(x);
    a.DoSomethingComplicated();
    return a;
}

Ответы [ 5 ]

2 голосов
/ 11 марта 2010

Нет, но вы можете написать именованную свободную функцию для этого.

B ToB( const A & a ) {
   B b;
   // process a somehow to add its data  to b
   return b;
}

Ваш код становится:

B CalculateSomething(double x)
{
    A a(x);
    a.DoSomethingComplicated();
    return ToB( a );
}

, что, возможно, яснее, чем неявное преобразование.

2 голосов
/ 11 марта 2010

Нет, я так не думаю. Неявное преобразование обычно кодируется перегруженным оператором. Это сделано и для базовых типов. Поскольку вы не можете изменить код A и B, нет способа сообщить компилятору, как это сделать. Ваш фрагмент получит ошибку.

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

return helper.convertToB(a);

my2c

0 голосов
/ 11 марта 2010

Даже если вы не можете изменить реализацию A или B, вы можете добавить встроенный конструктор к определению B, которое принимает const A &.

Однако я подозреваю, что, если классы действительно не связаны друг с другом, было бы лучше предоставить явную функцию преобразования - неявные преобразования могут стать огромным источником труднодоступных ошибок:

B CalculateSomething(double x)
{
    A a(x);
    a.DoSomethingComplicated();
    return ConvertAToB( a );
}
0 голосов
/ 11 марта 2010

Невозможно без изменения определения класса

0 голосов
/ 11 марта 2010

Существует два класса: A и B. Существуют алгоритмы для преобразования из типа A в тип B и обратно. Мы не можем коснуться их исходного кода. Могу ли я написать неявное преобразование между двумя типами?

Нет, если A и B не связаны, вы не можете. (И я благодарен за это. Неявные преобразования дают достаточно головной боли, поскольку они не способны создать их для сторонних классов.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...