如果类型/类有字段,则选择模板方法

发布于 2025-01-13 07:42:30 字数 760 浏览 0 评论 0原文

假设我有以下两种类型:

enum class TypeA {
    //...
};

class TypeB {
public:
    using _type = unsigned int;
    constexpr _type to_type();
    //...
};

我想设计一个 SFINAE 模板方法,如果类型 T 是普通枚举(即没有 _type)并且 ,则选择 版本 1如果版本 2 确实具有 typedef _type,则选择版本 2。

版本 1(如果 T 是普通枚举):

template<typename T>
inline constexpr std::underlying_type_t<T> underlying_cast(T p) { return static_cast<std::underlying_type_t<T>>(p); }

版本 2

template<typename T>
inline constexpr typename T::_type underlying_cast(T p) { return p.to_type(); }

我将如何解决这个问题?我也非常感谢 SFINAE 模板在这种情况下如何工作的解释。

Assume I have the following two types:

enum class TypeA {
    //...
};

class TypeB {
public:
    using _type = unsigned int;
    constexpr _type to_type();
    //...
};

I would like to design a SFINAE template method such that Version 1 is chosen if the type T is a normal enum (i.e., does not have _type) and Version 2 is chosen if it does have the typedef _type.

Version 1 (if T is a normal enum):

template<typename T>
inline constexpr std::underlying_type_t<T> underlying_cast(T p) { return static_cast<std::underlying_type_t<T>>(p); }

Version 2:

template<typename T>
inline constexpr typename T::_type underlying_cast(T p) { return p.to_type(); }

How would I go about this? I would also really appreciate an explanation of how the SFINAE templates work in this case.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

尘世孤行 2025-01-20 07:42:30

您不一定需要 SFINAE:

template<typename T>
constexpr auto underlying_cast(T p) { 
    if constexpr (std::is_enum_v<T>) return static_cast<std::underlying_type_t<T>>(p);
    else return p.to_type();
}

https://godbolt.org/z/o17ebbMxo

You don't necessarily need a SFINAE:

template<typename T>
constexpr auto underlying_cast(T p) { 
    if constexpr (std::is_enum_v<T>) return static_cast<std::underlying_type_t<T>>(p);
    else return p.to_type();
}

https://godbolt.org/z/o17ebbMxo

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文