首页 > 解决方案 > 为模板类创建两个指针并使用当前选择的可能?

问题描述

我将尝试使用示例代码展示我想要的内容:

template <typename T>
class myclass
{
    public: 
        myclass(int x, int y);
        // code
};
        
main()
{
    myclass<cat>* ptr1 = NULL;
    myclass<dog>* ptr2 = NULL;

    if (/*condition*/)
    {
        ptr1 = new  myclass<cat>(1,1);
        delete ptr2;
        current_ptr = ptr1; // how to declare
    }
    else 
    {  
        ptr2 = new  myclass<dog>(1,2);
        delete ptr1;
        current_ptr = ptr2; // how to declare
    }
    current_ptr->some_method(); //work with it
}

我想使用具有不同参数的模板类。怎么做?

标签: c++pointerstemplates

解决方案


模板是编译时构造。当模板被实例化时,它会创建不相关的类。

因此,myclass<cat>它们myclass<dog>是完全不同的、不相关的类,您不能在它们之间交换指针。

要在运行时混合它们,您需要某种形式的运行时多态性。最简单的是当你提前知道所有类型时,你就可以使用变体:

#include <variant>

int main() {
    std::variant<myclass<cat>, myclass<dog>> obj;

    if (/* runtime condition */) {
        obj = myclass<cat>{};
    } else {
        obj = myclass<dog>{};
    }

    // work with it:
    std::visit(
        [](auto const& myclass_obj) {
            // in here, myclass_obj is either a myclass<cat> or myclass<dog>
            // So the code has to be valid for both, unless using if constexpr.
            if constexpr (std::is_same_v<decltype(myclass_obj), myclass<cat> const&>) {
                // cat specific code
            } else {
                // dog specific code
            }
        },
        obj
    );
}

如果要继续使用指针,则需要一个基类:

class mybase {
public:
    virtual ~mybase() = default;
    virtual someMethod() = 0;
};

template<typename T>
class myclass : public mybase {
public:
    myclass(int x, int y) {}

    void someMethod() override {

    }
};

然后声明你的指针:

mybase* ptr = nullptr;

推荐阅读