gpt4 book ai didi

c++ - 模板类中的枚举

转载 作者:行者123 更新时间:2023-12-01 23:03:50 26 4
gpt4 key购买 nike

假设我有一个类 Class ,它有一个关联的枚举成员 Enum .枚举仅在此类的上下文中有意义,因此在其中指定。然后你可以调用Class::Enum::Something来自类之外,这很好。

class Class
{
public:
enum class Enum : uchar
{
Something
}
}

但是,如果类 Class是模板化的,你不能做 Class::Enum::Something , 但你必须 Class<T>::Enum::Something (或者 Class<>::Enum::Something 如果 T 有一些默认类型)。

template <typename T = double>
class Class
{
public:
enum class Enum : uchar
{
Something
}
}

Enum所有 T 必须相同s,因为它只是一个简单的枚举,但是 T无论如何总是必须指定。

我的问题是 - 是否有避免这种情况的巧妙方法?

最佳答案

重要的是要了解包装的枚举类型是 不同 Class 的不同特化类型。

#include <type_traits>

template <typename T = double>
struct S
{
enum class E : int { a };
};

static_assert(!std::is_same_v<S<>::E, S<int>::E>); // !!!

您似乎希望它实际上是同一类型,在这种情况下,您可以将它分解为一个单独的类,并使用私有(private)实现继承通过类模板特化来公开它:

#include <type_traits>

namespace detail {
struct Base {
enum class E : int { a };
};
} // namespace detail;

template <typename T = double>
struct S : private detail::Base
{
using Base::E;
};

static_assert(std::is_same_v<S<>::E, S<int>::E>); // OK

但是,如果您准备将此枚举作为各种类模板特化的成员(上面的别名声明)提供,您将需要限定您引用的特化。

S<>::E;
S<int>::E;

您似乎想要解决的根本问题是作用域,在这种情况下,您可以使用命名空间而不是类来包装关联的枚举:

namespace my_lib {

template <typename T = double>
struct S {};

enum class E : int { a };

} // namespace my_lib

关于c++ - 模板类中的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71382079/

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