gpt4 book ai didi

c++:覆盖父类中的模板成员函数

转载 作者:行者123 更新时间:2023-11-30 02:53:50 42 4
gpt4 key购买 nike

假设我有这样一个类结构:基类Object ,这是 Bool 的父类, Int , Float , BytesUnicode类。在我有一些功能之前 Bool cast_bool() const , Int cast_int() const等作为 Object 中的虚函数类和所有子类中,我分别实现了这些功能。

似乎更好的解决方案是实现template <typename TYPE> TYPE cast() const代替功能。但是,由于 C++ 禁止虚拟模板函数,我不知道如何才能完成此任务。我需要的是提供template <typename TYPE> TYPE cast() const对于 Object和它的 children 。通用 Object::cast<TYPE>() const只会抛出 CastError ;然后对于每种类型,如 Bool , Int等。我将实现类似 Bool::cast<Bool>() const 的功能, Int::cast<Bool>() const等。我什至计划将强制转换添加到内置对象,尽管现在我只是重载了 operator bool() const , operator signed short() const等。如果没有实现,模板必须从 Object 切换到它的通用形式。类,只是抛出一个错误。有没有办法做到这一点(也许我需要使用某种模式)?或者更容易留下像 Int cast_int() const 这样的功能?提前致谢!

最佳答案

像下面的例子一样添加一个中间类,或者只使用不带任何模板方法的 dynamic_cast

#include <iostream>
#include <string>
using namespace std;

template <class> class ObjectImpl;

class Object
{
public:
virtual ~Object() {}

template <class T>
T cast() const
{
if (auto obj = dynamic_cast<const ObjectImpl<T>*>(this))
{
return obj->cast();
}
else
{
throw std::string("cast error");
}
}
};

template <class T>
class ObjectImpl : public Object
{
public:
virtual T cast() const = 0;
};

class Bool : public ObjectImpl<bool>
{
public:
bool cast() const override { return true; }
};
class Float : public ObjectImpl<float>
{
public:
float cast() const override { return 12.34f; }
};

int main()
{
Object* obj = new Float;

cout << obj->cast<float>() << endl;

try
{
cout << obj->cast<bool>() << endl;
}
catch (std::string e)
{
cout << e << endl;
}

return 0;
}

关于c++:覆盖父类中的模板成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17586488/

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