Как избежать полиморфизма? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть тип данных OperationSequence. Ниже приведен OperationSequence.h

class OperationSequence
{
public:
    void appendOperation(std::function<double(double)> operation);
    void moveOperation(int operation_index);
    void eraseOperation(int operation_index);

    const std::vector<std::function<double(double)>>& data() const;
private:
    std::vector<std::function<double(double)>> operation_sequence;
};

double executeSequence(const OperationSequence& operation_sequence, double value);
void executeSequence(const OperationSequence& operation_sequence, const std::string& file_name);

Я должен реализовать printOperationSequence(const OperationSequence& operation_sequence).

Задание установило требование к операции равным f: double -> double. Некоторые операции, такие как Addition и Multiplication также были запрошены. Очевидной реализацией было бы создание интерфейса Operation и возможность его вызова с f: double -> double и метод std::string getName().

Каков будет хороший способ для OperationSequence оставаться этим универсальным, но также сделать его простым и эффективным для вывода значимой операции OperationSequence?

Значимый способ быть чем-то вроде умножения, сложения, ...

Является ли делегирование конструкции другому классу, который также создаст последовательность имя_операции, хорошая идея?

P.S. Не стесняйтесь улучшать название вопроса: D

1 Ответ

0 голосов
/ 07 ноября 2018

Если вы хотите избежать полиморфизма (даже если std::function использует его или подобное для стирания типа), вы можете создать класс Operation, чтобы добавить имя к функции:

struct Operation
{
    std::string name;
    std::function<double(double)> f;
};

class OperationSequence
{
public:
    void appendOperation(const Operation& operation);
    void appendOperation(const std::string& name, std::function<double(double)> f);

    void moveOperation(int operation_index);
    void eraseOperation(int operation_index);

    const std::vector<Operation>& data() const;
private:
    std::vector<Operation> operations;
};

тогда

void printOperationSequence(const OperationSequence& operation_sequence)
{
    for (const auto& op : operation_sequence.data()) {
         std::cout << op.name << std::endl;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...