gpt4 book ai didi

c++ - 有条件地重载运算符

转载 作者:行者123 更新时间:2023-11-28 06:09:51 25 4
gpt4 key购买 nike

我目前正在努力实现一些数学基础运算,并尽量避免使用第三方库。我一直在为 Scalar*VectorVector*Scalar 的乘法重载 operator*Scalar*Vector 点积的当前代码:

#include <vector>
#include <type_traits>

template<class Vector, class Scalar>
typename std::enable_if<std::is_floating_point<Scalar>::value, Vector>::type operator*
(
const Scalar &a,
const Vector &b
)
{
return Vector
(
a*b[0],
a*b[1],
a*b[2]
);
}

int main()
{
const std::vector<double> v1({1,2,3});
const double s1(2);
const auto result(s1*v1);
std::cout<< result << std::endl;
}

编译器错误信息是:

error: invalid operands to binary expression ('double' and 'const std::vector')

关于如何重载 * 运算符的任何建议,以便两个点积都是可能的?我不打算在自定义 vector 类中将这两个运算符实现为重载运算符。而不是那样,我的目标是模板化运算符。

最佳答案

我找到了很好的解释 here并用它来调整 vector 操作。在 vector 类头文件中,您基本上通过 struct is_vector 定义任何类型 T 默认情况下都不是 vector 。在下文中,所有可以充当 vector 的类型都必须明确列出,例如std::vector

#include <vector>
#include <type_traits>

template <typename T>
struct is_vector
{
static const bool value = false;
};

template <>
struct is_vector< std::vector >
{
static const bool value = true;
};

template <class Vector>
typename std::enable_if<std::is_vector<Vector>::value, double>::type
operator*(const Vector &a, const Vector &b);

在可执行文件中,代码看起来是一样的。

int main()
{
const std::vector<double> v1({1,2,3});
const double s1(2);
const auto result(s1*v1);
std::cout<< result << std::endl;
}

关于c++ - 有条件地重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31500367/

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