模板化的唯一指针

时间:2019-07-18 14:09:18

标签: c++ oop templates smart-pointers

我刚接触C ++。

我有一个名为Main_Alg的类,它运行(通用)主算法。我有与基类Calc_Type不同的类,还有两个派生类,分别为类A和类B

创建Main_Alg时,run将运行通用算法,并使用AB(在Calc_Type中为纯虚拟方法)求解)。由用户指定执行哪一个。

实现此目标的最佳方法是什么?

我想到了模板类Main_alg

if (parms == "A"){
    std::unique_ptr<Main_Alg<A>> main_alg(new Main_alg<A>);
    main_alg -> run;
}
else ... // for B or whatever

正在运行:

std::unique_ptr<T> method;
method -> solve;
method -> getsmthg; //method only implemented for base class Calc_type ` 

这会使事情变得过于复杂吗?这是好习惯吗?此外,任何阅读建议都将受到赞赏

2 个答案:

答案 0 :(得分:1)

std::unique_ptr<Main_Alg> main_alg(new Main_alg<A>;

这是不可能的。 Main_alg可以是类模板,也可以是类。不能两者兼有。 std::unique_ptr的第一模板参数是模板类型参数;不是模板模板参数。

我认为以下功能模板可能合适:

template<class T>
void run()
{
    Main_Alg<T> m;
    m.run();
}

并致电:

if (parms == "A"){
    run<A>();
else
    run<B>();

答案 1 :(得分:1)

如果您不熟悉C ++,请不要编写自己的模板。它们很酷,但是很难掌握,尤其是当您开始使用C ++编写代码时。

您已经编写了有关纯虚拟类的内容。如果有,则不需要模板。

class Calc_Type {
    virtual ~Calc_Type() {}
    virtual void run() = 0;
};

class A : public Calc_Type {
public:
    void run() override {
        stuff_to_do();
    }
};

class B : public Calc_Type {
public:
    void run() override {
        other_stuff_to_do();
    }
};

std::unique_ptr<Calc_Type> createJob(const std::string& name)
{
    if (name = "A") {
        return std::make_unique<A>();
    } else if (name = "B") {
        return std::make_unique<B>();
    }
    return std::make_unique<NoJob>();
}

// somewhere in the code:
auto job = createJob(userInput);
...
job->run();