标题可能具有误导性,但我真的不知道如何命名。
假设我有以下结构
template <typename T>
struct SillyBase{
void doFunnyStuff(vector<T> vec){
dummyField = T();
for(int i=0; i<10; i++)
vec.push_back(dummyField++);
}
T dummyField;
};
struct A : public SillyBase<char>{};
struct B : public SillyBase<float>{};
现在让我们进一步假设我有一个指针
ISillyBase* ptr;
指向SillyBase的DECENDANT类(A或B)的对象 - 但是,我不知道哪一个(我只知道它是A或B);
有没有办法让我调用doFunnyStuff()?
可能是这样的:
vector<dynamic_generic_type_of(ptr)> vec;
ptr->doFunnyStuff(vec);
谢谢!
答案 0 :(得分:1)
在您的示例中,您不能拥有SillyBase*
因为SillyBase
被定义为
template <typename T> struct SillyBase {...}
所以你需要提供类型......
另一个问题是,您将vector<T>
的副本传递给doFunnyStuff()
然后填充...这似乎不正确,因为当该方法返回时,您丢失了vec
,它应该是参考vector<T>&
?
答案 1 :(得分:0)
编辑:即使使用ISillyBase
,也没有虚拟模板成员这样的东西,因此您将无法定义带有vector<T>
参数的成员。
在您的示例中,没有SillyBase
这样的非模板类型,因此您无法声明SillyBase* ptr;
最后我并没有真正看到你想要实现的目标:/
答案 2 :(得分:0)
SillyBase *ptr;
甚至不应该编译。如果没有模板参数列表,SillyBase
不是类型,因此尝试在需要类型的上下文中使用它应该会失败。
由于你无法在第一时间创建指针,因此对于如何取消引用它没有真正的答案。
答案 3 :(得分:0)
这些实际上是两个绝对不同的类。 100年前在阿姨婚礼上遇到的课程中没有办法按名称调用功能。您必须重新设计解决方案,以包含模板类的一些基类 像
class SillyBaseBase
{
public:
void function doFunnyFunnyStuff(SillyBase<char> *)
{
SillyBase<char>::doFunnyStuff();
}
void function doFunnyFunnyStuff(SillyBase<float> *)
{
SillyBase<float>::doFunnyStuff();
}
}
答案 4 :(得分:0)
我认为您正在寻找的是内置的dynamic_cast模板功能。它动态地确定数据结构的类型,如果它不是实例,则返回null。语法是
dynamic_cast<the_template_definition>(the_template_instantiation)
一个重要的问题是模板类必须来自一个公共虚拟类。所以要做你想做的事,你可以使用以下代码:
#include <stdio.h>
class Top /* The parent class */ {
public:
virtual ~Top() {}; // You need one base virtual function in the base class
};
template <typename T> class SillyBase : public Top {
void doFunnyStuff(T dummyVar){
dummyField = dummyField + dummyVar;
}
T dummyField;
};
class A : public SillyBase<char>{};
class B : public SillyBase<float>{};
int main(){
A a;
Top *ptr = (Top*)(&a);
if(dynamic_cast<A*>(ptr) != NULL)
printf("ptr is of type A*\n");
if(dynamic_cast<B*>(ptr) != NULL)
printf("ptr is of type B*\n");
return 0;
}
该计划的输出将是:
ptr is of type A*
答案 5 :(得分:0)
我可能会使用dynamic_cast关键字。虽然在声明向量时会遇到问题。它必须是SillyBase类型。这个问题是,这需要使用模板参数,这些参数是未知的,也是不可能获得的。为了解决这个问题,我只是将vector放在base类型的Base类中,然后提供修改它的函数。 inheireire类将在基类中提供与向量相同名称的变量。 inheireire类,对基类的函数有用,希望能填充正确的向量。我不知道这是一个好主意还是一个坏主意,但这是我试图在我的项目中克服这个问题的方式。