Добрый день.
Есть алгоритм, который можно записать двумя способами. Первый способ (примеры не транслировал):
for(i=0;i!=max;++i){
if(flag==true) fun1(int); else fun2(int,double);
}
if(flag==true) fun3(int,double,float); else fun4(int,double,float,char);
Второй способ:
if(flag==true){
for(i=0;i!=max;++i) {fun1(int);}
fun3(int,double,float);
}
else{
for(i=0;i!=max;++i) {fun2(int,double);}
fun4(int,double,float,char);
}
Оба эти способа имеют недостатки:
В первом способе есть потери быстродействия, так как условие проверяется каждый раз в цикле.
Во втором способе два раза повторяется цикл. Это плохо, так как при изменении параметров цикла (например параметра max), придется править в двух местах и легко забыть, что надо поправить и в другом цикле.
Вопрос:
Спасибо.
UPD1:
Коллеги приводят разные варианты решений этого конкретного примера. Но вопрос не в этом конкретном примере. Вопрос как решать общий случай. Для этого конкретного примера оптимальное решение такое (назовем его третий вариант, пример не транслировал):
class T1{
public:
run1(){fun1(int);}
run2(){fun3(int,double,float);}
};
class T2{
public:
run1(){fun2(int,double);}
run2(){fun4(int,double,float,char);}
};
template<class T> alg(T t){
for(i=0;i!=max;++i) {t.run1();}
t.run2();
};
main(){
T1 t1;
T2 t2;
if(flag==true){
alg<T1>(t1);
}
else{
alg<T2>(t2);
}
}
в этом третьем варианте нет проверки внутри цикла и вместе с тем если надо править параметры цикла, то править придется только в одном месте - в шаблонной функции alg. Но решение получилось слишком многословным для такой пустяковой задачи. Нужен более общий подход.
Честно говоря не уверен, но думаю функтор облегчит выполнение
// функции для проверки
void f1() {std::cout << 1 << '\n';}
void f2() {std::cout << 2 << '\n';}
void f3() {std::cout << 3 << '\n';}
void f4() {std::cout << 4 << '\n';}
class Fun {
int k;
public:
Fun(int max) : k(max) {}
void operator ()(bool b = false) { // inline
int n = k;
if(b) {
while(n--) f1();
f3();
}
else {
while(n--) f2();
f4();
}
}
};
int main()
{
Fun obj(3);
obj();
obj(1);
return 0;
}
не уверен, потому что не знаю цель вашей задачи, и еще можно функции содержать в классе как статические закрытые члены
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Здравствуйте, за ранее извиняюсь за, возможно, нубский вопрос, но всё жеРазбираюсь с spring security, для своего приложения выполнил классическую...
Пишу небольшую игру, в ней генерируется случайное число, от этого числа зависит весь исход уровня, те надо его максимально рандомизировать,...
В main создал файл OutputВ него записываю данные через отдельную функцию