Как заставить MyClass работать с оператором std :: string +

Я пробовал неявное преобразование, но это не работает.

#include <string>
#include <iostream>

struct MyClass
{
operator std::string() { return "bar"; }
};

int
main( int argc, char* argv[] )
{
MyClass x;

std::cout << std::string( "foo" ) + x << std::endl;
return 0;
}

2

Решение

Неявное преобразование не будет работать, так как строка operator+ является шаблоном, и вы выводите параметры шаблона. Это выглядит как лучшее объяснение того, что происходит: https://stackoverflow.com/a/8892794/964135

Я просто сделал бы бросок или написал бы не шаблон operator+,


Глупое решение состоит в том, чтобы не выводить типы, и тогда он выполнит неявное преобразование:

std::cout << std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::string( "foo" ), x) << std::endl;
4

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

Вы пробовали перегрузить оператор +?

std::string operator+(std::string& str, MyClass& x){
return str + "bar"}

Это будет бесплатная функция, а не часть MyClass. Также может возникнуть необходимость перегрузить коммутативный случай. Вы можете выразить это в терминах вышеупомянутого, если это не имеет значения.

2

К хорошим ответам, данным Karthik T и Pubby относительно перегруженных operator+()Я хотел бы добавить один момент.

Обычно вам необходимо получить доступ к частным членам MyClass внутри перегружен operator+() код (в отличие от return "bar"; как в вашем предположительно урезанном примере). В этом случае вам нужно будет объявить его как friend, Вы не можете иметь operator+() как член MyClass, поскольку MyClass приходит на левой стороне оператора +, Ниже приведен пример кода.

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

struct MyClass {
public:
MyClass() : bar("bar") {}
friend string operator+(string& str, MyClass& x);
private:
string bar;
};

string operator+(string& str, MyClass& x) {
return str + x.bar;
}

int main( int argc, char* argv[] )
{
MyClass x;
string foo("foo");

std::cout <<  foo + x << std::endl;
return 0;
}
1
По вопросам рекламы [email protected]