c++ - 为模板类创建两个指针并使用当前选择的可能?
问题描述
我将尝试使用示例代码展示我想要的内容:
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;
推荐阅读
- laravel - 无法在 Laravel 应用程序中为 html2pdf 设置字体
- android - Android JobScheduler 未在 Vivo 手机上运行期间任务
- javascript - 如何在javascript中将两个数组与新属性合并
- php - 在 laravel 中无法使用 remember_token 如何设置 remember_token 和 cookie?
- android - Android Studio: Layout incomprehensibly positioned
- java - getter 和 setter 的问题
- hadoop - Hadoop HDFS 如何决定将哪些数据放入每个块中?
- mysql - 如何创建函数过滤 PostgreSQL 到 MySQL?
- spring-data-elasticsearch - 如何在弹性搜索中使用查询生成器从嵌套类中仅获取匹配的数据?
- bash - Bash,有没有办法在不使用双引号的情况下获得与双引号变量相同的功能