В коде используются два разных алгоритма. Какой из них выбран, определяется во время выполнения параметром (например, true или false). Я не хочу использовать операторы if каждый раз, когда появляется алгоритм.
Поэтому вместо того, чтобы каждый раз писать следующее
if (parameter==true)
algorithmOne();
else
algorithmTwo();
Я хочу установить алгоритм в начале, например
if (parameter==true)
algorithm()=algorithmOne();
else
algorithm()=algorithmTwo();
И с этого момента используйте только «алгоритм()».
Как выбрать алгоритм в начале в зависимости от параметра после того, как код уже скомпилирован?
3 ответа
Ты почти там:
auto algorithm = parameter ? algorithmOne : algorithmTwo
.
Нет ()
, здесь вы не пытаетесь вызвать какую-либо функцию.
Ответ, который вы ищете, скорее всего, является указателем на функцию/метод.
Синтаксис указателя на функцию следующий:
typedef void (*MyFunctionPointer)();
MyFunctionPointer *algorithm;
void function(bool parameter)
{
if (parameter)
algorithm = &myFirstAlgo;
else
algorithm = &mySecondAlgo;
}
void anotherFunction()
{
algorithm();
}
Обратите внимание, что этот подход работает для C, C++03 и C++11. Если вы хотите использовать auto
в глобальной области видимости, вам нужно указать значение по умолчанию.
Объектно-ориентированным способом сделать это было бы определение базового класса с интерфейсом алгоритма:
class AlgorithmBase
{
public:
virtual void algorithm() = 0;
virtual ~AlgorithmBase() {} // virtual destructor may be needed
};
Затем реализуйте классы для различных реализаций алгоритма:
class AlgorithmOne: public AlgorithmBase
{
public:
virtual void algorithm();
};
void AlgorithmOne::algorithm()
{
...
}
И аналогично для AlgorithmTwo
и других реализаций.
Теперь вы можете определить указатель на объект алгоритма, содержащий выбранную реализацию, и использовать его всякий раз, когда алгоритм должен выполняться:
AlgorithmBase *algorithm = 0;
if(parameter)
{
algorithm = new AlgorithmOne();
}
else
{
algorithm = new AlgorithmTwo();
}
...
algorithm->algorithm(); // Call the selected algorithm
...
delete algorithm; // Destroy algorithm instance before exiting
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .
std::function
, использование шаблона наследования и стратегии,...