有条件地使操作员过载

时间:2015-07-19 10:51:08

标签: c++ typetraits

我目前正在努力实现一些数学基础操作,并尽量避免使用第三方库。为了operator*Scalar*Vector的乘法,我不得不重载Vector*ScalarScalar*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')

有关如何使*运算符超载的任何建议,以便两个点积都可以吗?我不打算在自定义向量类中实现这两个运算符,作为重载运算符。而不是那样,我瞄准模板化运算符。

1 个答案:

答案 0 :(得分:1)

我找到了一个很好的解释here并用它来调整矢量操作。在向量类头文件中,您基本上通过struct is_vector定义默认情况下类型为T的任何类型都不是向量。在下文中,可以充当向量的所有类型都必须明确列出,例如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;
}