首页 > 解决方案 > 如何避免多态性?

问题描述

我有一个数据类型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 变得容易和高效?

有意义的方式是像乘法,加法,......

将构造委托给其他也会创建 operation_name_sequence 的类是个好主意吗?

PS随意改进问题标题:D

标签: c++design-patterns

解决方案


如果你想避免多态性(即使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;
    }
}

推荐阅读