كيفية قراءة قيمة مع مشغل >> ولكن لا المنشئ الافتراضي إلى قيمة؟

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

  •  08-07-2019
  •  | 
  •  

سؤال

template <class T>
T Read () {
  T t;
  cin >> t;
  if (cin.fail()) {
    // ...
  }
  return t;
}

وهذا الرمز عام قراءة قيمة من نوع T مع بعض معالجة الأخطاء إضافية. وهي تعتمد على وجود مشغل >> التي يمكن تحليل T، وبهذه الطريقة إنها قابلة للمد إلى أنواع جديدة.

ما لم أكن أدرك هو أنه يعتمد على T وجود منشئ افتراضي. الآن لقد أصبت في هذه المشكلة.

ما هي خياراتي؟

ما هي الطريقة الصحيحة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

والجري من تيار المدخلات يفترض دائما كائن تشييده بشكل كامل لكتابة فيه. لا يمكنك الحصول على حول الحاجة إلى بناء كائن، كل ما يمكن القيام به هو السماح لطرق مختلفة للقيام بذلك.

واحد طريقة للقيام بذلك يمكن أن تكون الصفات. ان الصفات القياسية تفعل ما تفعلونه:

template< typename T >
struct istream_traits
{
  inline static T read(std::istream& is)
  {
    T obj;
    is >> obj;
  }
}

template< typename T >
inline T read(std::istream& is)
{
  is >> std::ws;
  T obj = istream_traits<T>::read(is);
  is >> std::ws;
  if(!is.eof()) throw "dammit!";
  return obj; 
}

إذا كان لديك X النوع الذي لا يمكن أن يكون شيدت افتراضي، ولكن يمكن بناؤها من istream، فإن التخصصات التالية به:

template<>
struct istream_traits<X>
{
  inline static X read(std::istream& is)
  {
    return X(is);
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top