c ++获取动态泛型类型的指针?

时间:2010-01-07 23:56:36

标签: c++ generics templates dynamic

标题可能具有误导性,但我真的不知道如何命名。

假设我有以下结构

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);

谢谢!

6 个答案:

答案 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类,对基类的函数有用,希望能填充正确的向量。我不知道这是一个好主意还是一个坏主意,但这是我试图在我的项目中克服这个问题的方式。