或矢量,c++,iostream"/>

首页 > 解决方案 > 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>有什么选择?是否已经有实现此功能的库?鉴于这些关键字非常难以搜索,我可以找到关闭的是编译时间类型信息库,我可能会使用它来增强optionalvector输出,但我想避免重新发明轮子。

标签: c++iostream

解决方案


所以,基本的想法是你添加一个模板,它会根据它传递的对象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;
}

现场演示,这甚至适用于原始指针。不包括variantor vector,尽管添加也不应该太难。

要处理std::variant, std::tuplestd::pair您可能会做同样的事情,只是使用std::get<X>而不是operator*


推荐阅读