可以将operator *重载为多个int和一个char *?

时间:2015-11-06 17:53:37

标签: c++ overloading

我想获得功能,所以我可以这样做:

std::cout << "here's a message" << 5*"\n";

我尝试了以下内容:

std::string operator* (int lhs, const char* rhs) {
  std::string r = "";
  for(int i = 0; i < lhs; i++) {
    r += rhs;
  }
  return r;
}

我收到此错误消息:

error: ‘std::string operator*(int, const char*)’ must have an argument of class or enumerated type

根据这篇SO What does 'must have an argument of class or enumerated type' actually mean的答案,我几乎无法做到这一时期。那是真的吗?如果没有,我该如何解决这个问题或安排解决方法?

我知道我可以做的是rhs作为std::string,但是由于5*std::string("\n")非常笨重,所以练习的重点已经放弃了一半。

4 个答案:

答案 0 :(得分:5)

来自[over.oper]:

  

运算符函数应该是非静态成员函数或者是非成员函数   至少一个参数,其类型是类,对类的引用,枚举或对引用的引用   枚举

因此,您不能重载其参数都是内置的运算符。此外,为了找到operator*(int, std::string),它必须位于namespace std中,并且它的格式不正确,无法为该命名空间添加定义。

相反,你可以简单地提供一个小包装器:

struct Mult { int value; };

并为其提供重载:

std::string operator*(const Mult&, const char* );
std::string operator*(const char*, const Mult& );

答案 1 :(得分:3)

来自C ++ FAQ here

  

C ++语言要求您的运算符重载至少需要一个   “类类型”或枚举类型的操作数。 C ++语言会   不要让你定义一个所有操作数/参数都是的运算符   原始类型。

答案 2 :(得分:0)

你既不能也不必重载那个操作;

string ctor (2)为你做的工作

#include <iostream>
#include <string>

int main() {
    std::cout << "here's a message:\n" 
              << std::string(5, '\n') 
              << "EOF" << std::endl;
} 

输出:

here's a message:






EOF

(live at Coliru)

答案 3 :(得分:0)

您应该能够使用用户定义的文字来实现它。例如:

#include <iostream>
#include <string>


std::string operator"" _s(const char* s) { return std::string(s); }

std::string operator"" _s(const char* s, std::size_t len) { return std::string(s, len); }

std::string operator* (unsigned int k, std::string s) {
    std::string t;
    for (unsigned int i = 0; i < k; ++i) 
        t += s;

    return t;
}

std::string operator* (std::string s, unsigned int k) { return k * s; }

int main() {
    std::cout << "Jump!"_s * 5 << "\n";
}