模板指针,而不知道类型
Template pointer without knowing the type
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
类中声明。
我能以某种方式有一个指针,可以指向任何类型的模板类的实例,即使类包含方法,如在上面的例子?
我可以有一个指针,可以指向任何类型的模板类的实例,即使类包含方法,如在上面的例子?
不,你不能,为了实例化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;
}
现场演示
相关文章:
- MSVC 在不知道类型的情况下评估上下文(和错误)
- 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?
- 表达式必须具有类类型。不知道怎么解决
- msgpack:在不知道类型的情况下解包自定义类
- 在不知道其类型的情况下使用多个对象的相同方法
- 基类到派生模板类的强制转换指针,而不知道类型
- std::矢量插入,不知道元素的类型
- 我不知道如何调用参数为节点类型的函数
- 当我们不知道类型的大小时,如何为它分配内存?
- 重载模板化 lambda,而不知道非模板化参数的参数类型
- 动态C++与其他语言的比较 - 在不知道类型的情况下无法在对象上调用方法
- 不知道派生类型的静态CRTP类
- 为什么C++不知道TIMESTAMP_STRUCT类型
- 如何在不知道特定类型的情况下引用变量
- 是否可以在不知道类型的情况下调用析构函数
- 在不知道类型opencv的情况下访问矩阵值
- c++boost::任何在不知道类型的情况下使用该值的操作
- 当我不知道类型时如何将参数传递给函数
- 模板指针,而不知道类型
- 从模板类继承而不知道类型的c++类