我必须在一个数组中为我的项目保存不同类型的数据。我已经创建了一个用于生成对象的模板类。
GoogleMap.clear()
但是我不能在不使用抽象类的情况下将它们保存在一个数组中。我为此创建了一个void指针数组。我用它喜欢那个;
template<class Queue>
class Template {
public:
Queue value;
Template(Queue input) {
value = input;
}
};
没有抽象类,有没有可能的解决方案?我的意思是,我可以在模板类'数组中保存这个模板对象吗?
答案 0 :(得分:5)
创建层次结构并利用动态绑定:
class Base {
public:
virtual ~Base() {};
// ...
};
template<class Queue>
class Template : public Base {
Queue value;
public:
Template(Queue const &input) :value(input) {}
// ...
};
并将其用作:
Base *array[21];
array[index] = new Template<int>(number);
array[index + 1] = new Template<string>(text);
此外,使用诸如std::array
智能指针(例如std::shared_ptr<Base>
或std::unique_ptr<Base>
)之类的STL工具,而不是使用原始数组和原始指针:
std::array<std::unique_ptr<Base>, 21> arr;
arr[index].reset(new Template<int>(number));
arr[index + 1].reset(new Template<string>(text));
也更喜欢将成员变量初始化为构造函数的初始化列表而不是初始化。
答案 1 :(得分:2)
这通常表明您应该在更高级别重新考虑代码结构,以便您根本不需要这样做。
否则你有四个我看到的选择(如果算上#34,则为5个;不要这样做&#34;以上):
使用可以容纳所有类型数据的统一类型(例如std::string
并在需要时解析数字信息)。此功能可以包含在一个类中,该类提供成员函数以使其更容易。
使用boost::variant
,如果您不熟悉C ++,我建议您不要立即处理此类问题。
使用基类,如101010所述。我想补充一点,您可能希望基类中的枚举能够告诉您存储的数据类型
使用boost::any
,这比变体更难使用,即使它更容易理解。
如果没有关于您想要达到的目标的更多信息,我们无法提供更好的指导方针。
答案 2 :(得分:1)
我会使用变体类型。您可以推出own,但更喜欢使用boost::variant
:
#include <boost/variant.hpp>
#include <iostream>
#include <string>
using namespace std;
template<class Queue>
class Template
{
public:
Queue value;
Template() = default;
Template(Queue input) {
value = input;
}
};
template<typename T>
std::ostream& operator<<(std::ostream& os, Template<T> const& t)
{
os << t.value;
return os;
}
int main ()
{
using v_t = boost::variant<Template<int>, Template<string>>;
v_t ar[2];
ar[0] = Template<int>(1);
ar[1] = Template<string>("lmfao");
for (auto&& elem : ar) cout << elem << endl;
}
请注意
v_t
是变体的类型v_t
可以有更多类型,您可以选择填充数组boost::visitor