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 表达式中检查是否是格式良好的表达式。编写起来非常简单,并用作模板的约束。


标签:C++
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号