创建作为运算符

时间:2018-02-06 21:49:28

标签: c++

在C ++中是否可以创建自定义方法,它将作为重载运算符?例如简单的类:

class A
{
public:
  A(int val){ x = val;}
  int getInt(){ return (x + 2); }

private:
  int x;
};

如何使用方法toSpecialString,例如,以特殊方式格式化我返回的int,然后返回此string(例如" abc14") 。例如:

A a(12);
std::cout << a.getInt().toSpecialString() << std::endl;

作为输出,我期待&#34; abc14&#34;。在C ++中是这样的吗?

2 个答案:

答案 0 :(得分:3)

当然,例如

class A
{

  struct ReturnedInt {
    int x;

    // constructor
    ReturnedInt(int x_) : x(x_) { }

    // "transparent" type cast to int
    operator int() { return x; }

    std::string toSpecialString() {
      std::ostringstream oss{};
      oss << "abc" << x;
      return oss.str();
    }
  };

public:
  A(int val){ x = val;}
  ReturnedInt getInt(){ return (x + 2); } // I changed the return type but see the remarks below

private:
  int x;
};

然后

int main () {
  A a{12};
  std::cout << a.getInt() << '\n';
  std::cout << a.getInt().toSpecialString() << '\n';
}

打印

14
abc14

前者作为普通cout传递给operator<<的{​​{1}}(自动衰减),但在后者中我们使用返回值实际上是一个对象的事实。出于与前一行相同的原因,任何期望int的函数也将接受int。而且,在编译的二进制文件中,这种“包装器”结构应该是额外的零成本。

请注意,如果您不打算将其暴露给任何其他目的,则内部类可以是私有的(如我的示例中所示)。这不会与它被用作返回类型或调用其(公共)方法的事实相冲突。

答案 1 :(得分:1)

由于checkout scm 返回a.getInt().toSpecialString()

a.getInt()无效。 int不是类,因此不能有成员函数。

可能的解决方案:

  1. int添加为成员函数。

    toSpecialString()

    并将其用作:

    class A
    {
       ...
    
          std::string toSpecialString()
          {
             return std::string("abc") + std::to_string(getInt());
          }
    };
    
  2. 添加另一个类来创建字符串。

    a.toSpecialString();
    

    并将其用作:

    struct MyStringFormatter
    {
       std::string toSpecialString(int x)
       {
          return std::string("abc") + std::to_string(x);
       }
    };
    

    如有必要,可以更新MyStringFormatter().toSpecialString(a.getInt()); 以获取MyStringFormatter的实例并返回字符串。

    A

    可以用作:

    struct MyStringFormatter
    {
       std::string toSpecialString(A a)
       {
          return toSpecialString(a.getInt());
       }
    
       std::string toSpecialString(int x)
       {
          return std::string("abc") + std::to_string(x);
       }
    };
    
  3. 我的建议是使用第二种方法。它将类MyStringFormatter().toSpecialString(a); 与用于格式化A

    的特殊逻辑分开