Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Шаблоны. Помогите упростить класс. / 3 сообщений из 3, страница 1 из 1
30.03.2013, 17:47
    #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
30.03.2013, 18:48
    #38205582
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны. Помогите упростить класс.
Ivan IgnatovСея логика не обсуждается, она нужна.
Сия.
...
Рейтинг: 0 / 0
01.04.2013, 11:08
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Шаблоны. Помогите упростить класс. / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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