我有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);
}
答案 0 :(得分:1)
您可以让持有人持有派生类型而不是基本类型,并使用boost::any
或std::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);
}