У меня есть огромный кусок кода, который работает на двух версиях некоторого параметра, скажем ver1 и ver2.
Версия - это поле времени выполнения, и я намерен сохранить его как, так что мне не нужно создавать код с разными флагами, и те же файлы lib могут использоваться для обеих версий.
Теперь существуют разные поля, применимые для ver1, а некоторые для ver2.
Поэтому в коде в нескольких местах мне нужно сделать
if(ver1) {
// set fields specific to ver1
}
else {
// set fields specific to ver2
}
Мне не нравится идея помещать так может, если заявления в коде, поскольку код имеет тенденцию выглядеть уродливым.
Какие-нибудь альтернативы это?
Я думал о каком-то общем встроенном/макроопределении, где поле задано только в том случае, если флаг передан верно?
Кроме того, на стороне оптимизации не должно быть дорого, чем в противном случае
@edit - некоторые детали внутренней организации кода
Не удается опубликовать детали кода. Но одним из важных фактов является то, что его огромный код устаревания, который нуждается в обновлении с обратной совместимостью.
Параметр версии передается каждому классу, чтобы определить, какое поле должно быть установлено и которое игнорировать.
Часто используемым решением является наличие двух классов, представляющих версии 1 и 2, с общим базовым классом, определяющим интерфейс с виртуальными функциями. Таким образом, вы получаете только один, если /else, а затем таблица виртуальных функций заботится о выборе правильной функции.
Я бы сказал, если это не правдоподобное решение, то if-else - самый ясный способ.
Вы можете легко сделать это с помощью функций. Основная цель функций - уменьшить избыточность кода.
#define VERSION1 25
#define VERSION2 55
void checkVersion(int vers)
{
switch(vers)
{
case VERSION1:
code_Depending_On_Version1();
break;
case VERSION2:
code_Depending_On_Version2();
break;
}
}
Если это просто косметика, то:
void blabla0(bool ver1)
{
if(ver1)
{
blabla1();
return;
}
blabla2(); // save one else and two brackets, but get a return :-(
}
Если вы всегда знаете параметр во время компиляции, я бы использовал шаблоны
template<bool ver> blabla0()
{
if(ver1)
{
blabla1();
return;
}
blabla2();
}
Это эффективно (компилятор построит две специализированные версии функции) и очистится.
Я забыл еще один:
void blabla0(bool ver1)
{
ver1 ? blabla1(): blabla2();
}
Или используйте базовый виртуальный класс с двумя производными классами, специализированными для каждой версии, как это предложил Матс Петерсон.