Возможно ли получить автоматическое приведение из определенного пользователем типа в std :: string, используя cout? - PullRequest
3 голосов
/ 22 октября 2010

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

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

  string toStr () const;
};

, а затем использую его:

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

с явным приведением, все идет правильноно если я удаляю (строку), компилятор говорит, что ему нужен оператор приведения, объявленный в std :: string.Разве это не должно приводить мой тип автоматически?Решено: я перегружаю оператор << (ostream & os, const Literal & l). </p>

Ответы [ 2 ]

10 голосов
/ 22 октября 2010

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

Что вы можете сделать, это перегрузить оператор << для вашего класса Literal, и он будет приведен и вставлен в поток там. </p>

ostream &operator <<(std::ostream &stream, const Literal &rhs)
{
    stream << (string) rhs;
    return stream;
}
5 голосов
/ 23 октября 2010

Краткий ответ: продолжайте использовать приведение или 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) натот же звонок.

...