模板指针不知道类型

时间:2014-06-26 21:53:59

标签: c++ templates pointers generics

template <typename T>
class Container
{
    private:
    T data;
    public:
    Container(T newData) : data(newData) {}
    T getData() {return data;}
};


int main()
{
    Container* numContainer=new Container<int>(5);
    //Do something with numContainer
    delete numContainer;
}

由于必须指定Container指针的类型,例如int,因此无法编译。 正如我在一些快速谷歌搜索后发现的那样,这可以通过创建一个ContainerBase类来处理,该类不是模板,让Container从中派生出来。但是,如果指针属于ContainerBase类型,则不允许我使用getData()等方法,因为它返回类型T,因此无法在ContainerBase类中声明。< BR />

我可以以某种方式拥有一个指向任何类型的模板类的实例的指针,即使该类包含上述示例中的方法吗?

1 个答案:

答案 0 :(得分:3)

  

我可以以某种方式有一个指向任何类型的模板类的实例的指针,即使该类包含上述示例中的方法吗?

不,你不能,因为你的template class被实例化,编译器必须知道T的类型。将类模板视为类的蓝图,而不是类的具体定义。对于为模板类指定的每种类型(例如,Container<int>),编译器会生成单独的定义。当编译器看到模板类的名称(例如Container)时,无法凭空推断出它的类型。

恕我直言,你可以做的最好的事情是为了避免每次模板类型明确指定使用别名时如下例所示:

template <typename T>
class Container {
  T data;
public:
  Container(T const &newData) : data(newData) {}
  T getData() const {return data;}
};

using iContainer = Container<int>;

int main() {
    iContainer* numContainer=new iContainer(5);
    //Do something with numContainer
    delete numContainer;
}

或者使用运行时多态性,正如您已经提到的那样结合使用dynamic_cast,如下例所示:

class BaseContainer {
public:
    virtual ~BaseContainer() {}
};

template <typename T>
class Container : public BaseContainer {
  T data;
public:
  Container(T const &newData) : data(newData) {}
  T getData() const {return data;}
};

int main() {
  BaseContainer *numContainer = new Container<int>(5);

  Container<int> *ptr = dynamic_cast<Container<int>*>(numContainer);
  if(ptr) std::cout << ptr->getData() << std::endl;;
  delete numContainer;
}

LIVE DEMO