Я пишу класс, и я дошел до того, что могу выполнять операции, которые смешивают объекты моего класса и литералы 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);
который не покрыт и сам литерал не является объектом класса, как я понимаю. И так, выражения как целого быть не может.
Я понимаю, что могу создавать пользовательские литералы, но это не то, что я хочу сделать здесь. (хотя я не уверен, будут ли они работать или нет).
Я не смог найти какие-либо подсказки для просмотра вопросов, которые я должен был иметь отношение к этому сайту, и я не мог получить что-то, связанное с моей проблемой в сети.
Мой вопрос:
Есть ли способ, который может сделать любой заказ работает?
Этот код:
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 )
{}
это чище и эффективнее
Вы можете добавить глобальную функцию:
inline CLS operator+(const char *lhs, const CLS& rhs)
{
return CLS(lhs) + rhs;
}