格式和自定义打印一个std容器

格式和自定义打印一个std容器

本文介绍了提高::格式和自定义打印一个std容器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个函数在我的名字空间 NS ,可以帮助我打印STL容器。例如:

 模板< typename的T>
的std :: ostream的&放大器;运营商的LT;≤(的std :: ostream的和放大器;流,常量的std ::设为< T>&安培;集)
{
    流<< {;
    布尔第一= TRUE;
    对于(常量T&放大器;项目:集)
    {
        如果(!第一)
            流<< ,;
        其他
            第一= FALSE;
        流<<项目;
    }
    流<< };
    返回流;
}
:;< 直接

这与运营商的LT打印的伟大工程

 的std ::设为<标准::字符串> X = {1,2,3,4};
性病::法院LT&;<点¯x所述&;&下;的std :: ENDL;

然而,使用的boost ::格式是不可能的:

 的std ::设为<标准::字符串> X = {1,2,3,4};
提高::格式(%1%)%X;

问题是相当明显的:升压不知道,我想它使用个性化的运营商的LT;< 打印里面什么都没有做类型我命名空间。添加使用声明为升压/格式/ feed_args.hpp 之外,有一个方便的方法,使的boost ::格式找我运营商的LT;<


解决方案

我认为最干净的方法是在你自己的命名空间为每个要覆盖的运营商提供了一个瘦包装。对于你的情况,也可以是:

 命名空间NS
{
    命名空间的封装
    {
        模板<类T>
        结构体出
        {
            常量的std ::设为< T> &安培;设置;            出(常量的std ::设为< T>&安培;集):集(套){}            朋友的std :: ostream的&放大器;运营商的LT;≤(的std :: ostream的和放大器;流,常量出与放大器; O)
            {
                流<< {;
                布尔第一= TRUE;
                对于(常量T&放大器;项目:o.set)
                {
                    如果(!第一)
                        流<< ,;
                    其他
                        第一= FALSE;
                    流<<项目;
                }
                流<< };
                返回流;
            }
        };
    }    模板<类T>
    包装::出< T>出(常量的std ::设为< T>&安培;集)
    {
        返回包装::出< T>(套);
    }
}

然后使用它是这样的:

 的std ::法院LT&;<提高::格式(%1%)%NS ::出(X);

I have a function in my namespace ns that helps me print STL containers. For example:

template <typename T>
std::ostream& operator<<(std::ostream& stream, const std::set<T>& set)
{
    stream << "{";
    bool first = true;
    for (const T& item : set)
    {
        if (!first)
            stream << ", ";
        else
            first = false;
        stream << item;
    }
    stream << "}";
    return stream;
}

This works great for printing with operator << directly:

std::set<std::string> x = { "1", "2", "3", "4" };
std::cout << x << std::endl;

However, using boost::format is impossible:

std::set<std::string> x = { "1", "2", "3", "4" };
boost::format("%1%") % x;

The problem is fairly obvious: Boost has no idea that I would like it to use my custom operator << to print types which have nothing to do with my namespace. Outside of adding a using declaration into boost/format/feed_args.hpp, is there a convenient way to make boost::format look for my operator <<?

解决方案

I think the most clean way is to provide a thin wrapper in your own namespace for each of the operators you want to override. For your case, it can be:

namespace ns
{
    namespace wrappers
    {
        template<class T>
        struct out
        {
            const std::set<T> &set;

            out(const std::set<T> &set) : set(set) {}

            friend std::ostream& operator<<(std::ostream& stream, const out &o)
            {
                stream << "{";
                bool first = true;
                for (const T& item : o.set)
                {
                    if (!first)
                        stream << ", ";
                    else
                        first = false;
                    stream << item;
                }
                stream << "}";
                return stream;
            }
        };
    }

    template<class T>
    wrappers::out<T> out(const std::set<T> &set)
    {
        return wrappers::out<T>(set);
    }
}

Then use it like this:

std::cout << boost::format("%1%") % ns::out(x);

这篇关于提高::格式和自定义打印一个std容器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-07 06:40