将类型转换扩展为可转换类型的对/元组

时间:2016-09-22 21:36:03

标签: c++ type-conversion

我必须处理一堆2D点类型:pair<double>pair<float>pair<int>,并且我希望允许点之间的隐式转换只要存在坐标转换。像这样:

template< class From, class To > 
inline operator pair< To, To > ( pair< From, From > that )
{
    return make_pair( static_cast< To >( that.first ), 
                    static_cast< To >( that.second ) );
}

不幸的是,g++个对象:

convert.cpp:5:错误:'operator std :: pair(std :: pair)'必须是非静态成员函数

是否可以为pair s执行以上w / out定义包装类?

1 个答案:

答案 0 :(得分:1)

您无法将隐式转换为未知类型;转换运算符必须是一个非静态成员函数,它仍然需要你将它包装成一个类;并从未知类型(也称为模板化构造函数)编写转换构造函数。

为什么不想让它成为免费功能:

!

然后称之为:

template<typename To, typename From>
std::pair<To, To> convert(const std::pair<From, From>& p){
    return std::make_pair( static_cast< To >( p.first ), 
                static_cast< To >( p.second ) );
}

尽可能清楚。见Live on Coliru

编辑
(根据OP的评论)

你可以为这类事做一个快速的类型:

std::pair<float, float> mp{3.424, 59.35};
auto p2 = convert<double>(mp);

考虑使用template<typename T> class Point{ public: T x = T{}; T y = T{}; template<typename Y> Point(Point<Y> p) : x(static_cast<T>(p.x)), y(static_cast<T>(p.y)) { } Point(T x_val, T y_val) : x(x_val), y(y_val) { } Point(Point&&) = default; Point(const Point&) = default; Point& operator = (Point&&) = default; Point& operator = (const Point&) = default; }; 作为double的类型参数的此函数:

Point

由于转换构造函数,以下语句都可以正常工作。

void print(Point<double> p){
    std::cout << "(" << p.x << ", " << p.y << ")\n";
}

Live on Coliru

相关问题