gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:39:49 25 4
gpt4 key购买 nike

我有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 调用方法作为模板参数。但是,如果我有很多派生类,我该如何正确转换它呢?

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

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

最佳答案

您可以让 holder 持有派生类型而不是基类型,并使用 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);
}

关于c++如何创建派生类模板的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37373342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com