هل من الممكن الحصول على مصبوب تلقائي من النوع المعرفة من قبل المستخدم إلى 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. ألا يجب أن يلقي نوعي تلقائيًا؟ 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) على نفس المكالمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top