c++ - 不知道类型的模板指针

标签 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 类中声明。

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

最佳答案

Can I somehow have a pointer which can point to an instance of a template class of any type, even if the class contains methods such as in the example above?

不,你不能,因为你的 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

关于c++ - 不知道类型的模板指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24440872/

相关文章:

c++ - 我们如何获得存储在boost多边形中的所有点

c++ - 模板比文字函数慢?

templates - 推断模板中的 lambda 返回类型

c - 如何在数组中使用指针而不是括号

当数据复制/扫描/读取到未初始化的指针时崩溃或 "segmentation fault"

将 int 指针转换为 char 指针会导致 C 中的数据丢失?

c++ - 如何将文件中的字符放入二维 vector 中?

涉及运算符重载函数的 C++ 链接器错误

KO 模板中的 JavaScript

C++ vector 构造函数实例化冲突