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/