gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:20:29 24 4
gpt4 key购买 nike

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/

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