هل من الممكن الحصول على مصبوب تلقائي من النوع المعرفة من قبل المستخدم إلى 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. ألا يجب أن يلقي نوعي تلقائيًا؟ Solved: أنا مشغل التحميل الزائد << (Ostream & OS ، Consteral & L).
المحلول
لا .. Std :: String يجب أن يكون لها مُنشئ أخذ حرفيًا كحجة.
ما يمكنك فعله هو تشغيل Overload Operator << لفصلك الحرفي وجعله يلقي وأدخل في الدفق هناك.
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
هي حقا typedefs من instantiations القالب. وهناك وظيفة قالب لإدخال واحدة في الآخر.
// 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
) على نفس المكالمة.