Можно получить автоматическую отливку от пользовательского типа на STD :: String, используя Cout?

StackOverflow https://stackoverflow.com/questions/4000358

Вопрос

Как и в вопросе, если я определим оператор строки в моем классе:

class Literal {
  operator string const () {
    return toStr ();
  };

  string toStr () const;
};

И тогда я использую это:

Literal l1 ("fa-2bd2bc3e0");
cout << (string)l1 << " Declared" << endl;

С явным отведением все идет верно, но если я удалю (строку) компилятор говорит, что ему нужен литой оператор, объявленный в std :: string. Разве это не толоть мой тип автоматически? Решено: я перегружаю оператор << (OstTream & Os, Const Lebalal & L).

Это было полезно?

Решение

Нет .. STD :: string придется иметь конструктор, который взял литерал в качестве аргумента.

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

ostream &operator <<(std::ostream &stream, const Literal &rhs)
{
    stream << (string) rhs;
    return stream;
}

Другие советы

Краткий ответ: продолжайте использовать литой или toStr(), или напишите свой собственный operator<< функция. (Я бы предпочел l1.toStr() к (string)l1.)

Долгий ответ: это может работать, если бы стандартная библиотека была функция

std::ostream& operator<<( std::ostream&, std::string const& );

Что он почти делает, но не технически. Обе ostream а также string Действительно напечатаны экомациями шаблонов. И есть функция шаблона для вставки одного в другую.

// This is somewhat simplified.  For the real definitions, see the Standard
// and/or your complying implementation's headers.
namespace std {
  typedef basic_string<char> string;
  typedef basic_ostream<char> ostream;

  template <typename CharT>
  basic_ostream<CharT>& operator<<(
    basic_ostream<CharT>&, 
    basic_string<CharT> const&);
}

Так, когда вы используете cout << str где тип str является std::string, он может понять, что использует этот шаблон функцией, с CharT = char.

Но C ++ не позволяет вам выяснить компилятор как неявное преобразование типа (Literal к string) и вывести параметры шаблона шаблона функции (CharT = char) на тот же звонок.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top