【发布时间】:2018-09-04 19:05:55
【问题描述】:
最近我遇到了the question 讨论的is_streamable 类型特征。所以我决定实现自己的版本并提出下一个解决方案来检查是否可以从std::istream 读取类型:
template<typename, typename = void>
struct is_readable_from_stream_impl
: std::false_type {};
template<typename T>
struct is_readable_from_stream_impl<T,
std::void_t<decltype(std::declval<std::istream&>() >> std::declval<T>())>>
: std::true_type {};
template<typename T>
struct is_readable_from_stream :
is_readable_from_stream_impl<T> {};
template<typename T>
inline constexpr auto is_readable_from_stream_v = is_readable_from_stream<T>::value;
到目前为止,一切都很好。然后我添加了一个带有重载operator>>的自定义结构:
struct readable {};
std::istream& operator>>(std::istream& is, readable&)
{
return is;
}
并测试了类型特征:
static_assert(is_readable_from_stream_v<readable&>);
static_assert(!is_readable_from_stream_v<readable>);
gcc 8.2 和 clang 6.0.0 都通过了检查,但 MSVC rejects 是第二个断言。
我想知道我的实现(或测试)是否不正确,或者是 MSVC 的另一个问题。
【问题讨论】:
-
该特征的名称不应该类似于“使用 >> 运算符从流中读取”吗?从流中读取还有很多其他方式。
-
@NeilButterworth 这是一个玩具示例,我实际上并不关心命名那么多......
标签: c++ typetraits