Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > "Конвертер" для типа


Автор: mrgloom 27.8.2013, 14:12
допустим функция принимает 
Код

const Point<T> 
 , а я передаю стандартный 
Код

CPoint
 понятное дело я могу взять pt.x pt.y и подставить в конструктор, но есть ли какой то более изящный способ?

Автор: SenkraD 27.8.2013, 15:18
ну можете перегрузку сделать для функции или написать глобальный оператор преобразования типа,  или сделать конструктор у класса Point<T>, который принимает CPoint, тогда этот конструктор будет использоваться как оператор преобразования

Автор: mrgloom 27.8.2013, 15:45
а что такое
Цитата

 глобальный оператор преобразования типа

?

преобразования вида 
Код

(type) variable

работает только для структур?

Автор: SenkraD 27.8.2013, 16:55
с оператором приведения типа я ошибся маленько, так что он отпадает и если нельзя править класс Point<T>, то отсается или делать функцию прокладку, которая будет создавать временный обьект типа Point<T> c CPoint, или перегружать функцию и прятать всю конвертацию в нее

Автор: mrgloom 28.8.2013, 09:59
как раз функция прокладка или перегрузка мне не нужна, а изменение Point<T> возможно.

по идее всё таки надо просто написать конструктор Point<T>  для CPoint.

но интересно как можно сделать так
Код

func(Point<int> (CPoint))


Автор: SenkraD 28.8.2013, 10:57
можете показать протототип нужжной вам функции? она шаблонная? или принимает конкретную специализацию класса?
пока лучше этого не придумал:
Код
#include <cstddef>
#include <iostream>

struct CPoint
{
    std::size_t x;
    std::size_t y;
};

template <typename T>
struct Point
{
    Point(void)
        : x(0)
        , y(0)
    {
    }

    template<class PointType>
    Point(PointType const& point)
        : x(point.x)
        , y(point.y)
    {
    }

    T x;
    T y;
};

template <typename T>
void processPoint(Point<T> const& point)
{
    std::cout << "Point: [" << point.x << ", " << point.y << "]" << std::endl;
}

int main(int argc, char* argv[])
{
    Point<int> point;
    {
        point.x = 3;
        point.y = 4;
    }
    processPoint(point);

    CPoint cpoint = {5, 6};
    processPoint<int>(cpoint);        // I think that this one is better
    processPoint(Point<int>(cpoint)); // than it
    return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)