如果类型/类有字段,则选择模板方法
假设我有以下两种类型:
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您不一定需要 SFINAE:
https://godbolt.org/z/o17ebbMxo
You don't necessarily need a SFINAE:
https://godbolt.org/z/o17ebbMxo