powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Шаблоны. Помогите упростить класс.
3 сообщений из 3, страница 1 из 1
Шаблоны. Помогите упростить класс.
    #38205527
Фотография Ivan Ignatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Класс занимается тем, что представляет мульти-типовое 6-разрядное число, где каждый разряд имеет свой тип. Крутит итераторы: когда младший разряд доходит до end(), он его сбрасывает на begin() и накручивает итератор следующего разряда. Когда доходит до того, что все трераторы равны своим end() - ам, перестаёт идти вперёд.

Проход вперёд реализован в методе increment().

Сея логика не обсуждается, она нужна. Предлагать упрощать архитектуру приложения, которому это понадобилось - не надо, это ведроедный коллайдер шестого порядка на квази-рулезах. Короче, такой функционал нужен.

Хочется упростить реализацию этой многомерной фигни. Есть способы?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
template < typename T1, typename T2, typename T3, typename T4, typename T5, typename T6 > class MultiTypeCounter
{
public:
	MultiTypeCounter( const T1& _o1, const T2& _o2, const T3& _o3, const T4& _o4, const T5& _o5, const T6& _o6 )
	: o1( _o1 )
	, o2( _o2 )
	, o3( _o3 )
	, o4( _o4 )
	, o5( _o5 )
	, o6( _o6 )
	{
		it_t1 = o1.begin(); ite_t1 = o1.end();
		it_t2 = o2.begin(); ite_t2 = o2.end();
		it_t3 = o3.begin(); ite_t3 = o3.end();
		it_t4 = o4.begin(); ite_t4 = o4.end();
		it_t5 = o5.begin(); ite_t5 = o5.end();
		it_t6 = o6.begin(); ite_t6 = o6.end();
	}

	// return:
	// true on success
	// false if limit reached
	bool increment()
	{
		do
		{
			if ( it_t1 != ite_t1)
				++it_t1;
			if ( it_t1 != ite_t1 )
				break;
			it_t1 = o1.begin();

			if ( it_t2 != ite_t2)
				++it_t2;
			if ( it_t2 != ite_t2 )
				break;
			it_t2 = o2.begin();

			if ( it_t3 != ite_t3)
				++it_t3;
			if ( it_t3 != ite_t3 )
				break;
			it_t3 = o3.begin();

			if ( it_t4 != ite_t4)
				++it_t4;
			if ( it_t4 != ite_t4 )
				break;
			it_t4 = o4.begin();

			if ( it_t5 != ite_t5)
				++it_t5;
			if ( it_t5 != ite_t5 )
				break;
			it_t5 = o5.begin();

			if ( it_t6 != ite_t6)
				++it_t6;
			if ( it_t6 != ite_t6 )
				break;
			it_t6 = o6.begin();

			// Limit reached
			return false;

		} while ( 0 );
		return true;
	}

	typename T1::const_iterator &iter1() { return it_t1; }
	typename T2::const_iterator &iter2() { return it_t2; }
	typename T3::const_iterator &iter3() { return it_t3; }
	typename T4::const_iterator &iter4() { return it_t4; }
	typename T5::const_iterator &iter5() { return it_t5; }
	typename T6::const_iterator &iter6() { return it_t6; }

private:
	MultiTypeCounter(const MultiTypeCounter&);
	MultiTypeCounter& operator=(const MultiTypeCounter&);

	// const references
	const T1 &o1;
	const T2 &o2;
	const T3 &o3;
	const T4 &o4;
	const T5 &o5;
	const T6 &o6;

	typename T1::const_iterator it_t1, ite_t1;
	typename T2::const_iterator it_t2, ite_t2;
	typename T3::const_iterator it_t3, ite_t3;
	typename T4::const_iterator it_t4, ite_t4;
	typename T5::const_iterator it_t5, ite_t5;
	typename T6::const_iterator it_t6, ite_t6;
};
...
Рейтинг: 0 / 0
Шаблоны. Помогите упростить класс.
    #38205582
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan IgnatovСея логика не обсуждается, она нужна.
Сия.
...
Рейтинг: 0 / 0
Шаблоны. Помогите упростить класс.
    #38206729
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то вроде
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
template<typename T>
static bool CycleIterator(T::const_iterator& iter, const T::const_iterator& end, const T& collection){
	if ( iter != end)
		++iter;
	if ( iter != end)
		return true;
	iter = collection.begin();
	return false; 
}

//...

if(CycleIterator(it_t1, ite_t1, o1)) return true;

if(CycleIterator(it_t2, ite_t2, o2)) return true;

Это уменьшит дублирование. Если циклов такого рода больше одного, можно пытаться убрать и саму последовательность вызовов (вероятно, создав шаблонный тип, параметризуемый целым числом и частично специализированный для значений параметра 1..6), но ради одного случая я бы остановился на этом.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Шаблоны. Помогите упростить класс.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]