c++ - ostream for X,然后为可选生成, unique_ptr, shared_ptr, 可能是变体或矢量
问题描述
X
给定一个应该打印的类型,我自然会实现
std::ostream& operator<<(std::ostream& os, const X& x);
如果我想避免为 , 等各种包装器重复工作std::optional<X>
,std::unique_ptr<X>
我std::shared_ptr<X>
有什么选择?是否已经有实现此功能的库?鉴于这些关键字非常难以搜索,我可以找到关闭的是编译时间类型信息库,我可能会使用它来增强optional
和vector
输出,但我想避免重新发明轮子。
解决方案
所以,基本的想法是你添加一个模板,它会根据它传递的对象operator<<
的返回类型离开 SFINAE 。operator*
像这样的东西:
template <typename T, typename Expected>
using deref_to = std::is_same<std::decay_t<decltype(*std::declval<T>())>, Expected>;
template <typename T, typename = std::enable_if_t<deref_to<T, X>::value>>
std::ostream& operator<<(std::ostream &os, const T &foo) {
if(!foo)
os << "{}";
else
os << *foo;
return os;
}
现场演示,这甚至适用于原始指针。不包括variant
or vector
,尽管添加也不应该太难。
要处理std::variant
, std::tuple
,std::pair
您可能会做同样的事情,只是使用std::get<X>
而不是operator*
。
推荐阅读
- android - Flutter - 无法捕获 Firebase 身份验证异常
- java - 如何在 Spring Boot 库中使用注解(没有主类)?
- java - 如何使用 RestAssured 断言 JSON 2D 数组?
- c# - 我需要一个类似于 .NET 5.0 支持的 System.Runtime.Remoting 的替代方案
- mysql - 在最佳搜索某些排列时如何查询多对多?
- r - 在 tibble 上使用 lapply 时出错从双精度转换为逻辑
- sql - 访问/SQL 计数不同的值
- gitlab-ci - 带有扭锁的 Ci/CD 管道中的 Docker 图像扫描
- smtp - 带有附件的 Erlang SMTP 客户端
- android - 编号 1 下的 Linechart 将在 MPChart 处生成一条直线