微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为模板类创建两个指针并使用当前选定的可能吗?

如何解决为模板类创建两个指针并使用当前选定的可能吗?

我将尝试通过示例代码显示所需内容

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
}

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

解决方法

模板是一个编译时结构。实例化模板后,它将创建不相关的类。

因此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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。