如何解决为模板类创建两个指针并使用当前选定的可能吗?
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 举报,一经查实,本站将立刻删除。