c++之使用 C++17/20 简化模板 has_field
me-sa
阅读:32
2025-02-15 21:57:57
评论:0
给出下一个工作解决方案:
template<typename T, typename = void>
struct has_value_t : std::false_type { };
template<typename T>
struct has_value_t<T, decltype(T::value, void())> : std::true_type { };
template<typename T>
constexpr bool has_value = has_value_t<T>::value;
想法取自 https://stackoverflow.com/a/14523787/3743145
我想知道是否有 C++17/20 更简洁的方式来实现相同的效果。像
template<typename T>
constexpr bool has_value = .....;
用法:
template<typename T>
enable_if_t<has_value<T>,
std::ostream&> operator<<(std::ostream& os, T const& arg)
{
return os << arg.value;
}
请您参考如下方法:
如果 C++20 在桌面上,你可以用一个检查一个简单需求的概念来做到这一点
template <typename T>
concept has_value = requires(T) {
T::value;
};
template<typename T> requires has_value<T>
std::ostream& operator<<(std::ostream& os, T const& arg)
{
return os << arg.value;
}
T::value
在 requires 表达式中检查是否是格式良好的表达式。编写起来非常简单,并用作模板的约束。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。