سؤال

لقد كتب عدد قليل من الوظائف مع النموذج مثل هذا:

template <typename input_iterator>
int parse_integer(input_iterator &begin, input_iterator end);

الفكرة هي أن المتصل سوف نقدم مجموعة من الشخصيات ، وظيفة تفسير الأحرف قيمة عدد صحيح وإعادته ، وترك تبدأ في الماضي استخدام آخر حرف.على سبيل المثال:

std::string sample_text("123 foo bar");
std::string::const_iterator p(sample_text.begin());
std::string::const_iterator end(sample_text.end());
int i = parse_integer(p, end);

هذا من شأنه أن يترك i تعيين 123 ، p "لافتا" في الفضاء قبل foo.

عندي منذ قيل (دون شرح) أنه من السئ أن تمر مكرر من قبل المرجعية.هل هو سيء ؟ إذا كان الأمر كذلك, لماذا ؟

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

المحلول

وهناك شيء خاطئ حقا، ولكن من المؤكد أنها سوف تحد من استخدام القالب. أنت لن تكون قادرة على مجرد وضع مكرر إرجاعها بواسطة شيء آخر أو ولدت مثل v.begin()، منذ تلك ستكون المؤقتة المتقبلة. كنت دائما سوف يكون أول من جعل نسخة محلية، وهو نوع من النمطي ليس لطيفا حقا أن يكون.

وطريق واحد هو الإثقال عليه:

int parse_integer(input_iterator begin, input_iterator end, 
                  input_iterator &newbegin);

template<typename input_iterator>
int parse_integer(input_iterator begin, input_iterator end) {
    return parse_integer(begin, end, begin);
} 

وثمة خيار آخر هو أن يكون مكرر الانتاج حيث ستتم كتابة الرقم في:

template<typename input_iterator, typename output_iterator>
input_iterator parse_integer(input_iterator begin, input_iterator end,
                             output_iterator out);

وسيكون لديك قيمة الإرجاع إلى إعادة مكرر مدخلات جديدة. وكنت قد ثم استخدام مكرر الواضع لوضع أرقام تحليل في ناقلات أو مؤشر لوضعها مباشرة إلى عدد صحيح أو صفيف منه إذا كنت تعرف كمية من الأرقام.

int i;
b = parse_integer(b, end, &i);

std::vector<int> numbers;
b = parse_integer(b, end, std::back_inserter(numbers));

نصائح أخرى

بشكل عام:

إذا كنت تمر غيرconst المرجع المتصل لا أعرف إذا كان مكرر يتم تعديلها.

هل يمكن تمرير const المرجعية ، ولكن عادة التكرار هي صغيرة بما يكفي أنه يعطي أي ميزة على المارة القيمة.

في حالة الخاص بك:

أنا لا أعتقد أن هناك أي شيء خاطئ مع ما يمكنك القيام به, إلا أنه ليست معيار للغاية سقو فيما يتعلق مكرر الاستخدام.

وعندما يقولون "لا تمر بالرجوع" ربما هذا لأنه هو أكثر من العادي / اصطلاحي لتمرير المكررات كمعلمات القيمة، بدلا من تمريرها بالرجوع CONST: الذي قمت به، للمعلمة الثانية

في هذا المثال ولكن كنت بحاجة إلى العودة قيمتين: قيمة الباحث تحليل، و، و/ تعديل قيمة مكرر جديدة؛ وبالنظر إلى أن وظيفة ولا يمكن أن يكون اثنين من رموز الإرجاع، والترميز واحدة من رموز الإرجاع كمرجع غير CONST أمر طبيعي IMO.

وبديل سيكون لرمز شيئا من هذا القبيل:

//Comment: the return code is a pair of values, i.e. the parsed int and etc ...
pair<int, input_iterator> parse(input_iterator start, input_iterator end)
{
}

في رأيي، إذا كنت تريد أن تفعل هذه الحجة يجب أن يكون مؤشر إلى مكرر عليك أن تكون المتغيرة. أنا لست مروحة كبيرة من الحجج إشارة غير CONST لأنها تخفي حقيقة أن المعلمة التي تم تمريرها قد تغير. أعرف أن هناك الكثير من المستخدمين C ++ الذين يختلفون مع رأيي في هذا - وهذا شيء طيب

.

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

وبما أنه هو وسيلة رائعة لتفعل ما تريد ليس لديها هذه المشكلة، وأعتقد أنك يجب أن تستخدم فيه:

template <typename input_iterator>
int parse_integer(input_iterator* begin, input_iterator end);

والآن فإن المتصل عليك القيام به:

int i = parse_integer(&p, end);

وأنه سوف يكون واضحا أن مكرر يمكن تغييرها.

وبالمناسبة، أود أيضا litb في اقتراح من إعادة مكرر جديد ووضع القيم تحليل إلى الموقع المحدد بواسطة مكرر الانتاج.

في هذا السياق، وأعتقد أن تمرير مكرر بالرجوع غير معقول تماما، طالما أنها موثقة جيدا.

ومن الجدير بالذكر أن نهجكم (تمر مكرر بالرجوع إلى تتبع أين أنت عندما tokenizing تيار) هو بالضبط النهج الذي يتم تناوله عن طريق <لأ href = "http://www.boost.org/ وثيقة / يبس / 1_48_0 / يبس / tokenizer / index.html و "يختلط =" نوفولو "> دفعة :: tokenizer . على وجه الخصوص، راجع تعريف TokenizerFunction مفهوم . وعموما، أجد تعزيز :: tokenizer أن مصممة بشكل جيد جدا ومدروسة.

وأعتقد أن خوارزميات مكتبة ستاندرد تمر المكررات من حيث القيمة حصرا (سوف شخص الآن نشر استثناء واضح لهذا) - وهذا قد يكون أصل هذه الفكرة. بالطبع، لا شيء يقول أن التعليمات البرمجية الخاصة بك قد تبدو مكتبة ستاندرد!

والمعلمة الثانية إعلان وظيفة الخاص بك مفقود الإشارة، أليس كذلك؟

وعلى أي حال، والعودة إلى سؤالك: لا، أنا لم أقرأ أي شيء من أي وقت مضى أن يقول لك لا ينبغي أن تمر المكررات حسب المرجع. المشكلة مع المراجع هي أنها تسمح لك لتغيير الكائن المشار إليه. في هذه الحالة، إذا كنت لتغيير مكرر، كنت يحتمل الشد تسلسل كامل لابعد من ذلك وبالتالي تقديم مزيد من المعالجة مستحيلة.

واحد فقط اقتراح: اكتب المعلمات بعناية

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