Операторы перегрузки: порядок операндов при использовании литералов C ++

Я пишу класс, и я дошел до того, что могу выполнять операции, которые смешивают объекты моего класса и литералы C ++, но только в одном направлении.

Вот упрощенный код, который показывает идею:

#include <iostream>
#include <string>
using namespace std;

class CLS
{
string str;

public:
CLS(const char* param)
{    str = param;   }

CLS operator+(const CLS& rhs)
{
str = str + rhs.str;
return *this; }

friend ostream& operator<<(ostream& out, const CLS& rhs);
};

ostream& operator<<(ostream& out, const CLS& rhs)
{
out << rhs.str;
return out; }

int main()
{
CLS a("\n Hello ");
CLS b("bye!\n\n");

cout << a + "World!\n\n";

//cout << "\n Good " + b; /* this is not possible because of the operands order */
}

Как видите, я могу сделать что-то вроде:

a + "W";

но нет,

"W" + a;

Как указано в последней строке кода.

Я понимаю причину.

Первый эквивалентен:

a.operator+("W");

который покрыт моим классом. Тем не менее, второй, как,

"W".operator(a);

который не покрыт и сам литерал не является объектом класса, как я понимаю. И так, выражения как целого быть не может.

Я понимаю, что могу создавать пользовательские литералы, но это не то, что я хочу сделать здесь. (хотя я не уверен, будут ли они работать или нет).

Я не смог найти какие-либо подсказки для просмотра вопросов, которые я должен был иметь отношение к этому сайту, и я не мог получить что-то, связанное с моей проблемой в сети.

Мой вопрос:

Есть ли способ, который может сделать любой заказ работает?

3

Решение

Этот код:

cout << "\n Good " + b; /* this is not possible because of the operands order */

не работает, потому что вы сделали operator+ член (а не постоянный член). Если переписать его как отдельную функцию (возможно, друга), тогда эта проблема исчезнет:

friend
CLS operator+(const CLS& lhs, const CLS& rhs)
{
CLS r;
r.str = lhs.str + rhs.str;
return r;
}

если вы создаете дополнительный ctor, который принимает const std::string & было бы еще проще:

friend
CLS operator+(const CLS& lhs, const CLS& rhs)
{
return CLS( lhs.str + rhs.str );
}

обратите внимание, вы должны переписать существующий конструктор следующим образом:

CLS(const char* param) : str( param )
{}

это чище и эффективнее

4

Другие решения

Вы можете добавить глобальную функцию:

inline CLS operator+(const char *lhs, const CLS& rhs)
{
return CLS(lhs) + rhs;
}
2

По вопросам рекламы [email protected]