gpt4 book ai didi

c++ - 如何引用子类中定义的枚举

转载 作者:太空狗 更新时间:2023-10-29 22:59:26 25 4
gpt4 key购买 nike

假设我有以下基类:

class LongComplexClassName
{
public:
enum Blar { First, Second, Third };
void useBlar() { doSomething( First ); } // works.
};

class MyClass : public LongComplexClassName
{
void useBlar() { doSomething( First ); } // error: wants LongComplexClassName::First
};

void nakedFunction()
{
doSomething( First ); // same error...
};

有没有办法通过添加“using”声明来允许我在不完全限定它的情况下引用“First”?我可以使用命名空间来做到这一点。但是当枚举被定义为基类的一部分时可以做到吗?

最佳答案

允许引用First而不完全限定它

Is there a way, by adding "using" declarations to allow me to refer to "First" without fully qualifying it?

不,但是一个枚举可以按照它自己的条件处理。


对于 usingtypedef 声明,我们必须使用类型。所以

  • LongComplexClassName::Blar 是一个类型,但是
  • LongComplexClassName::Blar::First 是一个值。

在没有额外声明的情况下使用非限定的First

在下面的程序中,我们可以将First 传递给doSomething()。在类中我们不需要声明任何东西。

#include <iostream>
#include <typeinfo>

template <typename T>
void doSomething(const T& t)
{
std::cout << typeid(t).name() << ":";
std::cout << t << '\n';
}

class LongComplexClassName {
public:
enum Blar { First,Second,Third };
void useBlar() { doSomething(First); } // Works. First is an enum value
};

class MyClass : public LongComplexClassName {
public:
void useBlar() { doSomething(First); } // Also works. First is still an enum value
};

int main()
{
LongComplexClassName{}.useBlar();
MyClass{}.useBlar();
return 0;
}

在我的系统上这会产生:

enum LongComplexClassName::Blar:0
enum LongComplexClassName::Blar:0

从非成员函数引用First

接下来,对于函数,如果我们接受 LongComplexClassName::Blar::First 是一个值并相应地声明一个 const 那么我们就可以使用它了。

#include <iostream>
#include <typeinfo>

template <typename T>
void doSomething(const T& t)
{
std::cout << typeid(t).name() << ":";
std::cout << t << '\n';
}

class LongComplexClassName {
public:
enum Blar { First,Second,Third };
void useBlar() { doSomething(First); } // Works. First is an enum value
};

class MyClass : public LongComplexClassName {
public:
void useBlar() { doSomething(First); } // Also works. First is still an enum value
};

void nakedFunction()
{
using Blar = LongComplexClassName::Blar;
const auto First = Blar::First;
doSomething(First); // Works. Now First is a const variable of an enum value and can be used
}

int main()
{
LongComplexClassName{}.useBlar();
MyClass{}.useBlar();
nakedFunction();

return 0;
}

在我的系统上输出是:

enum LongComplexClassName::Blar:0
enum LongComplexClassName::Blar:0
enum LongComplexClassName::Blar:0

作为类枚举的一部分对First的引用

当然,我们也可以使用class enum。然后程序需要类中的 const 以允许使用 First 而无需限定它。

#include <iostream>
#include <typeinfo>
#include <type_traits>

template <typename T>
void doSomething(const T& t)
{
std::cout << typeid(t).name() << ":";
using ttype = std::underlying_type<T>::type;
std::cout << static_cast<ttype>(t) << '\n';
}

class LongComplexClassName {
public:
enum class Blar { First,Second,Third };
const LongComplexClassName::Blar First = Blar::First;
void useBlar() { doSomething(First); } // Works. First is a const variable of an enum value
};

class MyClass : public LongComplexClassName {
public:
void useBlar() { doSomething(First); } // Also works. First is a const variable of an enum value
};

void nakedFunction()
{
using Blar = LongComplexClassName::Blar;
const auto First = Blar::First;
doSomething(First); // Works. First is a const variable of an enum value and can be used
}

int main()
{
LongComplexClassName{}.useBlar();
MyClass{}.useBlar();
nakedFunction();

return 0;
}

在我的系统上这会产生:

enum LongComplexClassName::Blar:0
enum LongComplexClassName::Blar:0
enum LongComplexClassName::Blar:0

关于c++ - 如何引用子类中定义的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36865004/

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