在阵列中持有模板类对象

时间:2015-11-03 19:43:46

标签: c++ arrays templates

我必须在一个数组中为我的项目保存不同类型的数据。我已经创建了一个用于生成对象的模板类。

GoogleMap.clear()

但是我不能在不使用抽象类的情况下将它们保存在一个数组中。我为此创建了一个void指针数组。我用它喜欢那个;

template<class Queue>
class Template  {

public:
    Queue value;
    Template(Queue input) {
        value = input;
    }

};

没有抽象类,有没有可能的解决方案?我的意思是,我可以在模板类'数组中保存这个模板对象吗?

3 个答案:

答案 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;以上):

  1. 使用可以容纳所有类型数据的统一类型(例如std::string并在需要时解析数字信息)。此功能可以包含在一个类中,该类提供成员函数以使其更容易。

  2. 使用boost::variant,如果您不熟悉C ++,我建议您不要立即处理此类问题。

  3. 使用基类,如101010所述。我想补充一点,您可能希望基类中的枚举能够告诉您存储的数据类型

  4. 使用boost::any,这比变体更难使用,即使它更容易理解。

  5. 如果没有关于您想要达到的目标的更多信息,我们无法提供更好的指导方针。

答案 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;
}

Demo

请注意

  • v_t是变体的类型
  • v_t可以有更多类型,您可以选择填充数组
  • 输出操作符仅为演示重载
  • 您可以通过boost::visitor
  • 获得额外的功能