【问题标题】:Conditionally overload an operator有条件地重载运算符
【发布时间】:2015-07-19 10:51:07
【问题描述】:

我目前正致力于实现一些数学基础运算,并尽量避免使用第三方库。我被困在重载operator* 以将Scalar*VectorVector*Scalar 相乘。 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')

关于如何重载* 操作符,让这两种点积都成为可能,有什么建议吗?我不打算在自定义向量类中将这两个运算符实现为重载运算符。而不是那个,我的目标是模板化操作符。

【问题讨论】:

  • 顺便说一下,当至少有一种类型不是用户定义的非标准库类型时,不允许重载运算符。
  • 你不需要指定Scalar = double,它永远不会恢复你给它的;它总是会从你传递给它的参数中推断出ScalarVector
  • @CoffeeandCode:谢谢,要改变它。实际上,这很有意义。
  • @KerrekSB:Vector 将是我的应用程序中的一个自定义类。只是为了这个例子,我使用了 std::vector。我应该改变它....
  • 修复无关错误后,代码works for me。 (但程序仍然不正确,见上文。)

标签: c++ typetraits


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    相关资源
    最近更新 更多