Loading...
Vik1099 avatar Vik1099 2 Точки

Въпрос за задача Register от Special Class Members-Exercise

 

Здравейте, 

Задачата е Registers от C++ OOP лекцията за Special Class Members. Имам динамчния масив Company* companiesArray, който има размер size_t numAdded. Задачата ми е да итерирам през този масив и на база някакво условие да връщам информация за компанията намираща се на текущия индекс. Реших задачата със най обикновен for loop, но ми се искаше да я реша и със range based for loop. В stackoverflow намерих следното решение. 

namespace std {
	template <typename T> T* begin(std::pair<T*, T*> const& p) {
		return p.first;
	}
	template <typename T> T* end(std::pair<T*, T*> const& p) {
		return p.second;
	}
}
for (auto&& company : std::make_pair(companiesArray, companiesArray+numAdded)) {
		if (company.getId() == companyId) {
			return company;
		}
	}

1. Не мога да разбера защо е необходимо да връщаме r-value reference при положение, че работи и с нормална референция. И въобще, какво точно се случва, когато връщаме r-value в този случай.

2. Изглежда ми много странно, че тук е решено да се добави (не съм сигурен дали реално се добавя нещо, но така изглежда) нещо към std namespace.

Ето линк към цялата задача https://github.com/viktornikolov069/Register/tree/main

 

Поздрави,

Виктор Николов

Тагове:
0
C++ OOP 10/12/2021 16:34:28
Valleri avatar Valleri 304 Точки

Здравей, Виктор!
Автора на това решение е дефинирал какво значи 'begin' and 'end' за pair от пойнтъри.
begin & end са нужни методи за да може компилатора да генерира код за range-based for loop.
Във цикъла създаваме pair и след като компилатора знае началото и края може да го обходи.
Относно rvalue, не мисля, че в случая е нужен, тоест би трябвало да работи и с lvalue reference.

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.