c++ - 创建一个接受 2 个输入参数的文字运算符函数

标签 c++ operators

我有一个定义类型 Coordinates ,如下所示:

#include <array>
using Coordinates = std::array<double, 3>;

我为此调用了以下运算符重载函数:

Coordinates operator+(const Coordinates& lhs, const Coordinates& rhs);
Coordinates operator*(const Coordinates& lhs, const Coordinates& rhs);

两个重载都有效,所以如果我有 2 个 Coordinates 变量:

C1 = { 1., 2., 3.}C2 = { 1., 2., 3. }

C1+C2 返回 { 2., 4., 6.}

C1*C2 返回 { 1., 4., 9.}

现在我想定义一个 *+ 运算符:

C1*+C2 返回 1。 + 4. + 9.14.

我尝试了以下实现:

Coordinates operator*+(const Coordinates& lhs, const Coordinates& rhs)
{
    return lhs[0] * rhs[0] + lhs[1] * rhs[1] + lhs[2] * rhs[2];
}

但是,*+ 不是预定义的运算符。然后我尝试了这种格式:

Coordinates operator "" *+(const Coordinates& lhs, const Coordinates& rhs)
{
    return lhs[0] * rhs[0] + lhs[1] * rhs[1] + lhs[2] * rhs[2];
}

但我明白了:无效的文字运算符名称。这是可以理解的:

double operator "" _d_(const Coordinates& lhs, const Coordinates& rhs)
{
    return lhs[0] * rhs[0] + lhs[1] * rhs[1] + lhs[2] * rhs[2];
} 

_d_ 代表点积中的点,但现在我收到此错误 too many parameters for this literal。是否可以为点积定义一个运算符,或者我是否必须编写一个 dot() 函数?

最佳答案

您只能为您的类型重载 38 个现有运算符。此处列出:https://en.cppreference.com/w/cpp/language/operators

op - any of the following 38 (until C++20) 39 (since C++20) operators:
+ - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= <=>(since C++20) && || ++ -- , ->* -> ( ) [ ]

文字运算符处理单个参数并将文字(如 42、“foobar”)转换为对象。由于您已经拥有对象,因此您必须使用运算符重载。选择任何可用的。

关于c++ - 创建一个接受 2 个输入参数的文字运算符函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54443677/

相关文章:

c++ - MSSQL ODBC 拒绝有效的 TINYINT 值(数值超出范围)

c++ - 如何检索 vector 中第一个找到的具有最低值的元素

c++ - 我可以使用仅提供复制构造函数的类创建类对象吗?

c - C 中的 IN 运算符

c++ - 在 Type::var 的情况下,范围解析运算符返回什么?

c++ - QT 从文件和文件夹列表中选择多项

c++ - QGraphicsItem 和 Tab 键顺序

regex - 怎么样?在正则表达式中使量词变得懒惰

R: += (plus equals) 和++ (plus plus) 等价于 c++/c#/java 等?

c++ - 为什么构造函数在对象调用时使用不同的运算符 - String& vs Char*?