Существует 2 enum-а: UserRole (гость, оператор, админ) и Storage (хранилище1, хранилище2...)
Первый enum вряд ли будет расширяться, второй будет расширяться по мере добавления новых модулей в проект.
Нужно написать функцию, которая в зависимости от роли пользователя и типа хранилища вернёт true или false. Т.е. своего рода "таблица истинности":
bool isAccessEnabled( UserRole role, Storate storage )
{
switch ( storage )
{
case st1:
switch ( role )
{
case guest:
return false; // Значения, определяемые логикой работы приложенияcase moderator:
return true;
case admin:
return true;
}
break;
case s22:
switch ( role )
{
case guest:
return true; // Значения, определяемые логикой работы приложенияcase moderator:
return true;
case admin:
return true;
}
break;
// ...
}
// ...
}
Вопрос: каким образом лучше решать такие задачи?
Можно, конечно, явно "хардкодить" всю логику, выкидывать ненужные case-ы (например, if ( role == admin ) return true, можно объявить bool массив.
Но в идеале хотелось бы решения, которое бы в compile time выдавало ошибку, если какие-то состояния явно не определены.
Здравствуйте, SaZ, Вы писали:
SaZ>Доброго времени суток,
SaZ>Существует 2 enum-а: UserRole (гость, оператор, админ) и Storage (хранилище1, хранилище2...) SaZ>Первый enum вряд ли будет расширяться, второй будет расширяться по мере добавления новых модулей в проект.
Твою дивизию... Неужели туту можно заиспользовать шаблон Visitor?!
On 05.03.2013 18:03, SaZ wrote:
> Можно, конечно, явно "хардкодить" всю логику, выкидывать ненужные case-ы > (например, if ( role == admin ) return true, можно объявить bool массив.
Ну можно табличку 2х3, но понятно нынче тру-програмеры простыми путями
не ходят.
Здравствуйте, Vzhyk, Вы писали:
V>On 05.03.2013 18:03, SaZ wrote:
>> Можно, конечно, явно "хардкодить" всю логику, выкидывать ненужные case-ы >> (например, if ( role == admin ) return true, можно объявить bool массив. V>Ну можно табличку 2х3, но понятно нынче тру-програмеры простыми путями V>не ходят.
Под bool массивом я и понимал табличку 2 на 3: bool result[2][3] = { 0/*...*/ };
Хочется чего-то более наглядного. Я понимаю, что задача выглядит примитивной, но надо же когда-то учиться
On 05.03.2013 18:48, SaZ wrote:
> Под bool массивом я и понимал табличку 2 на 3: bool result[2][3] = { > 0/*...*/ }; > Хочется чего-то более наглядного. Я понимаю, что задача выглядит > примитивной, но надо же когда-то учиться
Куда уж нагляднее?
Или у тебя задача писать код долго и сложно и большим количеством
строчек, чтобы после тебя никто не догадался что же он делает?
Здравствуйте, Vzhyk, Вы писали:
V>Или у тебя задача писать код долго и сложно и большим количеством V>строчек, чтобы после тебя никто не догадался что же он делает?
Да скорее хотелось поизвращаться с шаблонами (так уж сложилось, что я с ними практически не работал, за исключением использования готовых классов qt, буста и стл).
Как-то так
Здравствуйте, SaZ, Вы писали:
SaZ>Да скорее хотелось поизвращаться с шаблонами (так уж сложилось, что я с ними практически не работал, за исключением использования готовых классов qt, буста и стл). SaZ> bool result = IsModuleAvailable< Employee, CallHistory >(); SaZ>Поигрался, получилось, успокоился.
Если нужно тестировать только compile-time значения (а не runtime, как в исходном сообщении), то посмотри на boost::mpl::map:
Здравствуйте, SaZ, Вы писали:
SaZ>Нужно написать функцию, которая в зависимости от роли пользователя и типа хранилища вернёт true или false. Т.е. своего рода "таблица истинности": SaZ>Вопрос: каким образом лучше решать такие задачи?
SaZ>Можно, конечно, явно "хардкодить" всю логику, выкидывать ненужные case-ы (например, if ( role == admin ) return true, можно объявить bool массив. SaZ>Но в идеале хотелось бы решения, которое бы в compile time выдавало ошибку, если какие-то состояния явно не определены.
Мультиметоды спасут отца русской демократии?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Kernan, Вы писали:
K>Здравствуйте, SaZ, Вы писали:
SaZ>>Доброго времени суток,
SaZ>>Существует 2 enum-а: UserRole (гость, оператор, админ) и Storage (хранилище1, хранилище2...) SaZ>>Первый enum вряд ли будет расширяться, второй будет расширяться по мере добавления новых модулей в проект. K>Твою дивизию... Неужели туту можно заиспользовать шаблон Visitor?!
ИМХО попроще — мультиметоды...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, SaZ, Вы писали:
SaZ>Здравствуйте, Vzhyk, Вы писали:
V>>Или у тебя задача писать код долго и сложно и большим количеством V>>строчек, чтобы после тебя никто не догадался что же он делает?
SaZ>Да скорее хотелось поизвращаться с шаблонами (так уж сложилось, что я с ними практически не работал, за исключением использования готовых классов qt, буста и стл). SaZ>Как-то так SaZ> . . .
SaZ>Поигрался, получилось, успокоился.
Когда результат зависит только от двух констант компиляции, было бы логично получать его также на этапе компиляции, это ведь не влечет ни дополнительных расходов ни ограничений, а полезным оказаться может:
Здравствуйте, rg45, Вы писали:
R>Когда результат зависит только от двух констант компиляции, было бы логично получать его также на этапе компиляции, это ведь не влечет ни дополнительных расходов ни ограничений, а полезным оказаться может: R>...
Благодарю. Я думал, что с включенной оптимизацией inline + const будет достаточно для такого поведения.