将向量的元素强制转换为用户定义的类型

Cast elements of vector to user defined type

本文关键字:用户 定义 转换 类型 向量 元素      更新时间:2023-10-16

我正在寻找一种好的现代方法,将向量的所有元素强制转换为cv::Point或其他用户定义的结构类型:

struct ColorSpacePoint
{
    int X;
    int Y;
}
struct NewColorSpacePoint  
{
    int X;
    int Y;
}
std::vector<ColorSpacePoint> points{ColorSpacePoint{2,3}, ColorSpacePoint{9,6}};
std::vector<NewColorSpacePoint> = ...
std::vector<cv::Point> = ...

您可以向ColorSpacePoint:添加一个转换运算符

struct ColorSpacePoint
{
    int X;
    int Y;
    operator NewColorSpacePoint() { return {X,Y}; }
};

或者NewColorSpacePoint:的非显式构造函数

struct NewColorSpacePoint  
{
    int X;
    int Y;
    NewColorSpacePoint (const ColorSpacePoint& rhs) : X{rhs.X}, Y{rhs.Y} {}
};

这将允许您只使用std::vector范围构造函数:

std::vector<NewColorSpacePoint> new_points {points.begin(), points.end()};

如果您不想使用隐式转换,可以制作一个免费函数并使用std::transform:

NewColorSpacePoint to_new_color (const ColorSpacePoint& csp) {
    return {csp.X,csp.Y};   
}
std::vector<NewColorSpacePoint> new_points;
new_points.reserve(points.size());
std::transform(points.begin(), points.end(),
               std::back_inserter(new_points), to_new_color);

添加从ColorSpacePointNewColorSpacePointcv::Point的转换运算符,例如:

struct NewColorSpacePoint  
{
    int X;
    int Y;
};
struct ColorSpacePoint
{
    int X;
    int Y;
    operator NewColorSpacePoint() { return {X, Y}; }
};

然后使用std::vector的构造函数,该构造函数以迭代器的范围为参数:

std::vector<ColorSpacePoint> points{ColorSpacePoint{2,3}, ColorSpacePoint{9,6}};
std::vector<NewColorSpacePoint> new_points(points.begin(), points.end());

或者使用std::vector::insert:

std::vector<NewColorSpacePoint> new_points;
new_points.insert(new_points.end(), points.begin(), points.end());