gpt4 book ai didi

c++ - 静态多态和模板容器

转载 作者:太空宇宙 更新时间:2023-11-04 12:31:19 25 4
gpt4 key购买 nike

我正在尝试使用静态多态性和模板来创建一个容器,该容器可以容纳更多的一种类型,据我所知,模板无法完成,但我希望我错了并且有一种方法。我有以下类(class):

template<class Derived>
class base
{
public:
base(string);
void clean()
{
cout << "I'm cleannig \n";
}
void process()
{
static_cast<Derived*>(this)->setup();
static_cast<Derived*>(this)->run();
static_cast<Derived*>(this)->cleanup();
}
string name;
};

template<class Derived>
base<Derived>::base(string y):name(y)
{
}


class derived : public base<derived>
{
friend class base<derived>;
void setup() {cout << "derived setup \n"; }
void run() { cout << "derived run \n"; }
void cleanup() { cout << "derived cleanup \n"; }

};


class derived1 : public base<derived1>
{
friend class base<derived1>;
void setup() {cout << "derived1 setup \n"; }
void run() { cout << "derived1 run \n"; }
void cleanup() { cout << "derived1 cleanup \n"; }
};

我不想创建一个可以容纳它们的容器,我试过这段代码 -

template <class T>
class Y{
public:
std::vector<base<T>> m_vec;

};


template <typename T>
class D:public Y<T>
{
public:
friend class Y<T>;
void print()
{
for(auto& e: Y<T>::m_vec)
{
e.process();
}
}
};


int main()
{
base<derived>* b = new base<derived>;
base<derived1>* c = new base<derived1>;

D<derived> y;
y.m_vec.push_back(b);
y.m_vec.push_back(c);
y.print();
}

但它不起作用我试着这样做:

 y.m_vec.push_back(static_cast<base<derived>>(c));

我收到了这个错误:

error: no matching function for call to ‘std::vector, std::allocator > >::push_back(base*&)’ y.m_vec.push_back(b);

最佳答案

经过一些测试和挖掘,答案是没有办法做到这一点。 但是你可以像@formerlyknownas_463035818 建议的那样使用 std::any将 std::vector 声明为:

std::vector<std::any> m_vec;

代替

std::vector<base<T>> m_vec;

并使用 boost demangle 函数获取类型 -

std::string name(boost::core::demangle(e.type().name()));

然后使用某种工厂函数将 any_cast 转换为您需要的类型

 if(!name.compare("base<derived1>*") )
{
try {
auto* r = any_cast<base<derived1>*>(e);
r->process();
}
catch(const std::bad_any_cast& e) {
std::cout << e.what() << '\n';
}
}
else
{
try {
auto *r = any_cast<base<derived> *>(e);
r->process();
}
catch(const std::bad_any_cast& e) {
std::cout << e.what() << '\n';
}
}

或者不使用 demangle 名称并使用字符串比较,您可以使用类 any 的 type() 函数并比较 typeid,如下所示:

    if(e.type()==typeid(base<derived1>*))

关于c++ - 静态多态和模板容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58520033/

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