У меня есть класс, скажем
class AddElement{
int a,b,c;
}
С помощью методов для установки / получения a, b, c ... Мой вопрос определенно является логическим вопросом - скажем, я реализую AddElement следующим образом:
int Value=1;
Value+=AddElement.get_a()+AddElement.get_b()+AddElement.get_b();
Теперь представьте, что я хочу сделать выше, за исключением того, что «a, b, c» теперь являются массивами, и вместо «добавления» я делаю скалярное сложение. Во время выполнения иногда мне нужно 'a', но не 'b' или 'c', поэтому я могу переписать как:
Value+=AddElement.get_a();
(Конечно, + = перегружен для представления скалярного сложения ... и значение того же размера, что и a) - В других случаях мне может понадобиться только b или c для добавления и т. Д. *
Есть ли способ выбрать, какие элементы, a, b, c, я хочу инициализировать и позже использовать во время выполнения? (т.е. я не хочу распределять по массиву огромный массив, если я не собираюсь его использовать).
В конце мне нужен класс, который имеет a, b, c, а затем методы, которые могут работать с любой комбинацией a, b или c - чтобы пользователь определял, какие методы ему нужны во время выполнения (с помощью некоторого флага или файл конфигурации).
В настоящее время я делаю следующее:
Value+=AddElement.get_a()*FlagA+AddElement.get_b()*FlagB+AddElement.get_c()*FlagC;
где FlagA = 1, если вы хотите использовать «a» в добавлении, или 0, если вы не хотите, чтобы оно было включено (то же самое для FlagB и FlagC). Это дорого, если массив 'a' очень большой.
Я, наверное, просто недостаточно хорошо соображаю, но эта проблема беспокоит меня. Если я вам понадоблюсь, чтобы лучше определить проблему, я постараюсь, но я считаю, что этого достаточно, чтобы донести свою мысль.
Редактировать 2
Я также забыл добавить, что не могу использовать какие-либо условия во время реализации дополнения (это будет использоваться в ядре CUDA, и у меня не может быть никакого расхождения потоков - я надеялся избежать упоминания CUDA, так как это полностью вопрос c ++)
Редактировать 3
Я считаю, что мне нужно использовать виртуальные функции. Я хочу вызывать функцию таким же образом, за исключением того, что она выполняет функцию для конкретного случая.
Редактировать 4
Я был бы признателен, если бы кто-то взглянул на мое решение - может быть, оно слишком «экзотично», и есть более простой метод для достижения той же цели. Спасибо за все предложения!
Редактировать 5
Благодаря другому пользователю я посмотрел на шаблон стратегического дизайна - и это именно то решение, которое я использовал для этой проблемы. Я никогда не слышал об этом раньше и в итоге переосмыслил проблему, которая уже была решена (потребовалось время, чтобы кто-то что-то об этом упомянул). Итак, решение:
Определить алгоритм во время выполнения = шаблон стратегического проектирования.