C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – boost :: format和定制打印std容器大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在我的命名空间ns中有一个函数可以帮助我打印STL容器.例如:
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;
}

这对于用操作符<<直:

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

但是,使用boost :: format是不可能的

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

问题是相当明显的:Boost不知道我希望它使用我的自定义运算符<<打印与我的命名空间无关的类型.除了在boost / format / Feed_args.hpp中添加使用声明之外,是否有一种方便的方式来使boost :: format找到我的运算符<?

解决方法

我认为最干净的方法是为您要覆盖的每个操作符在您自己的命名空间中提供一个薄的包装器.对于你的情况,它可以是:
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);
    }
}

然后使用它:

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

大佬总结

以上是大佬教程为你收集整理的c – boost :: format和定制打印std容器全部内容,希望文章能够帮你解决c – boost :: format和定制打印std容器所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。