c ++如何创建派生类模板的实例

时间:2016-05-22 10:46:02

标签: c++ templates

我有base类和一堆派生类(为简单起见,这里只有一个)。我还有holder类,其中一个派生类作为模板参数。我希望holder对象创建派生类的实例。这是代码:

class base {
protected:
    int value;
public:
    base() : value (0) { }
    base(int value) : value(value) { }
};

class derived : public base { };

template <class T>
class holder {
public:
    holder(T) {}
    T create(int value) {
        return T(value);
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    holder<base*> h(&derived());
    derived* d = h.create(1); // error here
}

我收到错误error C2440: 'initializing' : cannot convert from 'base *' to 'derived *'。我想这是因为变量的类型是holder<base*>,所以create方法被调用base作为模板参数。但是,如果我有很多派生类,我该如何正确地转换呢?

UPD。 我更改了holder::create方法,因此它使用std::remove_pointer,但我仍然遇到相同的编译错误。

T create(int value) {
    return new (std::remove_pointer<T>::type)(value);
}

1 个答案:

答案 0 :(得分:1)

您可以让持有人持有派生类型而不是基本类型,并使用boost::anystd::any(c ++ 17)来存储所有持有者。

#include "iostream"
#include "boost/any.hpp"
#include "vector"

class base {
protected:
    int value;
public:
    base() : value (0) { }
    base(int value) : value(value) { }
};

class derived1 : public base {
public:
    derived1(int value) : base(value) {};
};
class derived2 : public base {
public:
    derived2(int value) : base(value) {};
};

template <class T>
class holder {
public:
    holder() {}
    T* create(int value) {
        return new T(value);
    }
};

int main()
{
    std::vector<boost::any> list;
    holder<derived1> h1;
    holder<derived2> h2;
    list.push_back(h1);
    list.push_back(h2);
    derived1* pd1 = boost::any_cast<holder<derived1>>(list[0]).create(1);
    derived2* pd2 = boost::any_cast<holder<derived2>>(list[1]).create(2);
}