gpt4 book ai didi

c++ - 使用枚举编译时多态性

转载 作者:太空宇宙 更新时间:2023-11-04 13:39:32 28 4
gpt4 key购买 nike

所以,问题与枚举继承有关,我在这里看到了很多主题,其中描述了如何编写支持继承的枚举的方法,但我认为这不是我的情况。

我找到了一些我想做的东西。所以我的想法是我有类,让它成为 OpenGL 纹理类(实际上是),并且有一个枚举代表纹理中一个属性的所有可能值。

class Texture
{
public:
enum Filter
{
LINEAR = 1,
BILINEAR = 2,
ANISOTROPIC = 3
};

public:
Texture(Filter _filter)
: filter(_filter)
{ }

private:
Filter filter;
};

以及继承它的类。派生类中的枚举必须重新定义,但我可以在基类的构造函数中进一步使用:

class Texture2d : public Texture
{
public:
enum Filter
{
LINEAR = 1,
BILINEAR = 2
};

public:
Texture2d(Filter _filter)
: Texture(_filter)
{ }
};

但是,当然,这不起作用,因为新创建的 FilterTexture2d::Filter,而不是 Texture::Filter

我试过像这样使用枚举类:

class Texture
{
public:
enum class Filter;

public:
Texture(Filter _filter)
: filter(_filter)
{ }

private:
Filter filter;
};

class Texture2d : public Texture
{
public:
enum Filter
{
LINEAR = 1,
BILINEAR = 2
};

public:
Texture2d(Filter _filter)
: Texture(_filter)
{ }
};

但这确实是个愚蠢的想法。我认为,如果我只想扩展枚举,我会编写一些类包装器,但我也需要缩小枚举。那么问题来了,如何让这个东西在编译时工作呢?这是主要问题 - 让这个在编译时工作。还有一个问题:实际上尝试做这样的事情是可以的,或者我必须检查我的应用程序的架构?

(所有答案将不胜感激)

最佳答案

我没有发现你的代码有问题。
您只需在 Texture2d 的构造函数中添加一个转换。

Texture2d(Filter _filter) // no Texture::Filter
: Texture(static_cast<Texture::Filter>(_filter))
{ }

Texture t1(Texture::LINEAR); // WORKS
Texture t2(Texture::BILINEAR); // WORKS
Texture t3(Texture::ANISOTROPIC); // WORKS

Texture2d t4(Texture2d::LINEAR); // WORKS
Texture2d t5(Texture2d::BILINEAR); // WORKS
Texture2d t6(Texture2d::ANISOTROPIC); // ERROR

那是因为 Texture2d::ANISOTROPIC 被解释为 Texture::ANISOTROPIC 因为没有 Texture2d::Filter::ANISOTROPIC 存在。

由于 Texture2d 的构造函数都不接受 Texture::Filter,因此会导致错误。

关于c++ - 使用枚举编译时多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28265923/

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