gpt4 book ai didi

c++ - 将类型转换扩展到可转换类型的对/元组

转载 作者:行者123 更新时间:2023-11-30 05:22:28 29 4
gpt4 key购买 nike

我必须处理一堆二维点类型: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 定义包装类的情况下执行上述操作?是吗?

最佳答案

您不能对未知类型进行隐式转换;同样,转换运算符必须是一个非静态成员函数,它仍然需要你将它包装成一个类;并编写一个来自未知类型的转换构造函数(又名模板化构造函数)。

你为什么不想让它成为一个免费的功能:

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 ) );
}

然后这样调用它:

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

这已经很清楚了。看吧Live on Coliru

编辑
(根据OP的评论):

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

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";
}

由于 Converting 构造函数,下面的语句都可以工作。

int main() {
Point<float> mp{4.535, 395.3};
Point<int> ip = mp;
print(mp);
print(ip);
return 0;
}

查看Live on Coliru

关于c++ - 将类型转换扩展到可转换类型的对/元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39649260/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com