gpt4 book ai didi

c++ - 我如何转换模板类

转载 作者:行者123 更新时间:2023-12-02 10:04:39 27 4
gpt4 key购买 nike

我有一个类似C++的示例,在该示例中,我收到一个指向基类exampleParent的指针,并希望将其强制转换为一个指向继承的类example的指针(实际上,我只想在example上调用一个函数)。需要注意的是,继承的类是模板化的。在下面的示例中,我知道模板的类型为int,所以没有问题。总的来说,如果我事先不知道模板的类型,什么是这样做的好方法?

class exampleParent{};

template<typename P>
class example: public exampleParent
{
public:
int do_something() const
{
std::cout<<"I am doing something"<<std::endl;
return 0;
}
};

boost::shared_ptr<const exampleParent> getPtr()
{
return boost::make_shared<const example<int>>();
}

int main()
{
boost::shared_ptr<const exampleParent> example = getPtr();
auto example_ptr = boost::dynamic_pointer_cast<const example<int>>(example);
return example_ptr-> do_something();
}

我建议的一种解决方案是将代码更改为以下形式:
class exampleParent{};
class something_interface: public exampleParent
{
public:
virtual int do_something() const = 0 ;
};

template<typename P>
class example: public something_interface
{
public:
int do_something() const override
{
std::cout<<"I am doing something"<<std::end;
return 0;
}
};

boost::shared_ptr<const exampleParent> getPtr()
{
return boost::make_shared<const example<int>>();
}

int main()
{
boost::shared_ptr<const exampleParent> example = getPtr();
auto example_ptr = boost::dynamic_cast<const something_interface>(example);
return example_ptr->do_something();
}

这可以工作,但是感觉有点不合时宜: something_interface不应真正存在,因为它本身没有面向对象的解释。

任何帮助,将不胜感激!

最佳答案

如果可以将exampleParent设为抽象类(如果可以完全修改该类),那将是最好的:

class exampleParent
{
public:
virtual ~exampleParent() = default;
virtual int do_something() const = 0;
};
template<typename P>
class example: public exampleParent
{
public:
int do_something() const override
{
std::cout<<"I am doing something"<<std::endl;
return 0;
}
};

然后,您无需强制转换即可调用该方法。

如果您不能触摸此 exampleParent类,请按照建议的方式继续进行操作,但要记住实际上是继承 exampleParent且不引发异常,只需将方法设置为纯虚拟即可:
class intermediate: public exampleParent
{
public:
~intermediate() override = default;
virtual int do_something() const = 0;
};

否则,唯一的方法是对所有可能的类型执行 dynamic_pointer_cast并检查转换结果,因为模板类的不同实例通常只是不同的类型。当然,如果有无限数量的可能模板参数 P,这没有任何意义。

关于c++ - 我如何转换模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60894537/

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