gpt4 book ai didi

c++ - 如何将项目放入具有模板化父类(super class)类型的 vector 中

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:34 26 4
gpt4 key购买 nike

假设我有以下 2 个类 SuperDeriv其中 DerivSuper 的子类.

SuperDeriv都是模板化类。我想创建一个 vector类型 Super<?> . ?在哪里表示任何类型。目前我想出了这个:

#include <iostream>
#include <vector>

template <typename T>
class Super {
public:
T val;
Super(T val) : val(val) {};
};

template <typename T>
class Deriv : public Super<T> {
public:
Deriv(T val) : Super<T>(val) {};
};

int main() {
std::vector<Super*> a;
a.push_back(new Deriv<int>(1));
a.push_back(new Deriv<float>(1.0f));

std::cout << a[0]->val << std::endl;
return 0;
}

当然这是行不通的,因为std::vector<Super*>需要像 std::vector<Super<int>*> 这样的模板类型.然而,问题是我只能将项目添加到 Super<int>* 类型的 vector 中而不是 Super<float>* .

如何更改此代码以允许我添加 Super类型或其派生到具有任何模板类型的 vector ,如 int , float , short等等?

最佳答案

不确定这是否可以解决您的问题,但它可能会给您一些想法。这里的基本思想是为所有类型的 T 创建一个父类(super class)。对于基本数据类型,需要包装类。

#include <iostream>
#include <cstdio>
#include <vector>
#include <string>

class SuperT {
public:
virtual std::string AccessData() = 0;
};

class IntWraper : public SuperT {
public:
IntWraper(int i) : val(i) { };
virtual std::string AccessData() { return std::to_string(val); };
private:
int val;
};

class FloatWraper : public SuperT {
public:
FloatWraper(float f) : val(f) { };
virtual std::string AccessData() { return std::to_string(val); };
private:
float val;
};


class RealSuper {
public:
virtual std::string DoSomething() = 0;
};

template <typename T>
class Super : public RealSuper {
public:
T* wraper_val_;
Super(T* w_val) : wraper_val_(w_val) { };
~Super() { if(wraper_val_) delete wraper_val_; };
virtual std::string DoSomething() { return wraper_val_->AccessData(); }
};

template <typename T>
class Deriv : public Super<T> {
public:
Deriv(T* w_val) : Super<T>(w_val) {};
};

int main() {
std::vector<RealSuper*> a;
a.push_back(new Deriv<IntWraper>(new IntWraper(1)));
a.push_back(new Deriv<FloatWraper>(new FloatWraper(1.0f)));

std::cout << a[0]->DoSomething() << std::endl;
std::cout << a[1]->DoSomething() << std::endl;

return 0;
}

关于c++ - 如何将项目放入具有模板化父类(super class)类型的 vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45024025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com