创建一个采用2个输入参数的文字运算符函数

时间:2019-01-30 15:09:52

标签: 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];
}

但是我得到了:invalid literal operator name。可以理解的:

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()函数?

2 个答案:

答案 0 :(得分:3)

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

  

op-以下38个(直到C ++ 20)中的任何一个39 (自C ++ 20起)   操作员:
  + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= <=> (自C ++ 20起) && || ++ -- , ->* -> { {1}} ( ) [

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

答案 1 :(得分:1)

首先,您可以查看list of operators,以了解此处存在的内容,以了解哪些可以过载,哪些不能过载。

第二点,您可以尝试使用类似this answer的方法来创建自定义运算符。请记住,从技术上讲,这并不是一个新的运算符(因为您无法在C ++中创建自己的运算符),但确实需要一些模板魔术来完成同一件事。