Можно получить автоматическую отливку от пользовательского типа на STD :: String, используя Cout?
-
25-09-2019 - |
Вопрос
Как и в вопросе, если я определим оператор строки в моем классе:
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
) на тот же звонок.