c++ - 使用 sfml vector 的模板函数重载解决方案

标签 c++ templates operator-overloading sfml

我正在尝试为 sfml 库的“sf::Vector2”模板类(基本上只包含指定类型的 x 和 y 参数)编写一些运算符。我需要实现关于“vector - vector ”和“vector -标量/标量- vector ”交互的基本算术运算符。这是我到目前为止所做的一个示例(乘法运算符):

//multiply vectors
template<typename TResult, typename TLeft, typename TRight>
inline auto operator*(const sf::Vector2<TLeft>& lhs, const sf::Vector2<TRight>& rhs){
    return sf::Vector2<TResult>(lhs.x * rhs.x, lhs.y * rhs.y);
}
//multiply sf vector and scalar
template<typename VT, typename ST>
inline auto operator*(const sf::Vector2<VT>& vect, const ST& scalar) {
    return sf::Vector2<VT>(vect.x * scalar, vect.y * scalar);
}
template<typename VT, typename ST>
inline auto operator*(const ST& scalar, const sf::Vector2<VT>& vect) {
    return vect * scalar;
}

问题是当我尝试调用一个运算符时,例如:

sf::Vector2<int> v1, v2;
sf::Vector2<int> v3 = v1 * v2;

编译器使用了 such 运算符的第二个版本(涉及标量的那个),因此会生成一个错误。我认为这不会发生,并且由于重载决议,编译器会考虑运算符的第一个版本(该函数接受两个 vector 而不是一个 vector 和一个泛型类型)。我有什么不明白的?

最佳答案

在您的 vector 乘法重载中,无法推导出模板参数 TResult。您可以使用 std::common_type_t 解决此问题:

template<typename TLeft, typename TRight>
inline auto operator*(const sf::Vector2<TLeft>& lhs, const sf::Vector2<TRight>& rhs){
    return sf::Vector2<std::common_type_t<TLeft, TRight>>(lhs.x * rhs.x, lhs.y * rhs.y);
}

关于c++ - 使用 sfml vector 的模板函数重载解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44079709/

相关文章:

c++ - 从 dll 中导入显式实例化的模板类

c++ - 重载索引运算符以模仿 POD 多维数组?

php exec 函数运行不正常

android - Ifstream 不会使用 JNA Android Studio 打开文件 C++

C++ 模板 : Pass Type, 不是实例?

c++ - 动态分配自定义类的数组并重载运算符

c++ - 有没有办法重载 operator= 以对右侧的函数具有特定行为

c++ - 如何消除链接器错误 mingw32/bin/ld.exe : cannot find -lSDL

c++ - 获取 ram 制造商

c# - 是否有在现有模板中添加 css 模板的解决方案?