我必须处理一堆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定义包装类?
答案 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";
}