namespace N0 {
namespace N1 {
namespace {
enum Enum { Enum_0 = 1, Enum_1 = 2, Enum_2 = 4, Enum_3 = 8 };
enum class ScopedEnum { Enum_0 = 1, Enum_1 = 2, Enum_2 = 4, Enum_3 = 8 };
}
Enum Global = Enum_3;
struct Base {
Enum m_e = Enum_1;
};
class Class : public Base {
public:
Class(Enum e) : m_ce(e) {}
static int StaticFunc(const Class &c) {
return c.PrivateFunc(c.m_inner) + Global + ClassStatic;
}
const Enum m_ce;
static int ClassStatic;
static const int ClassStaticConst = 8;
static constexpr int ClassStaticConstexpr = 9;
static constexpr float ClassStaticConstexprFloat = 10.f;
static constexpr double ClassStaticConstexprDouble = 11.0;
static constexpr long double ClassStaticConstexprLongDouble = 12.0;
static const Enum ClassStaticConstEnum = Enum_3;
static const ScopedEnum ClassStaticConstScopedEnum = ScopedEnum::Enum_2;
private:
struct Inner {
char x;
short y;
int z;
};
int PrivateFunc(const Inner &i) const { return i.z; }
Inner m_inner{};
};
int Class::ClassStatic = 7;
template<typename T>
struct Template {
template<Enum E>
void TemplateFunc() {
T::StaticFunc(T(E));
}
};
void foo() { Template<Class>().TemplateFunc<Enum_0>(); }
} // namespace N1
} // namespace N0
int main() {
N0::N1::foo();
return 0;
}