【cxx-prettyprint源码学习】自定义支持及其它

如何支持数组输出

经过对is_container及print_container_helper的分析,可以得知,如果要支持数组输出,需要提供const_iterator、begin、end:

template<typename T>
struct array_wrapper_n
{
     typedef const T * const_iterator;
     typedef T value_type;

     array_wrapper_n(const T * const a, size_t n) : _array(a), _n(n) { }
     inline const_iterator begin() const { return _array; }
     inline const_iterator end() const { return _array + _n; }

private:
    const T * const _array;
    size_t _n;
};

包裹并提供全局快捷访问函数

template<typename T>
inline pretty_print::array_wrapper_n<T> pretty_print_array(const T * const a, size_t n)
{
    return pretty_print::array_wrapper_n<T>(a, n);
}

使用方式如下:

std::cout << pretty_print_array(arr, n) << std::endl

支持自定义分隔符

支持自定义分隔符的关键是将print_container_helperTDeimiters类型替换成为自定义的分隔符类型:

提供支持Custom Deimiters的输出类:

    struct custom_delims_base
    {
        virtual ~custom_delims_base() { }
        virtual std::ostream & stream(::std::ostream &) = 0;
        virtual std::wostream & stream(::std::wostream &) = 0;
    };

    template <typename T, typename Delims>
    struct custom_delims_wrapper : custom_delims_base
    {
        custom_delims_wrapper(const T & t_) : t(t_) { }

        std::ostream & stream(std::ostream & s)
        {
            return s << print_container_helper<T, char, std::char_traits<char>, Delims>(t);
        }

        std::wostream & stream(std::wostream & s)
        {
            return s << print_container_helper<T, wchar_t, std::char_traits<wchar_t>, Delims>(t);
        }

    private:
        const T & t;
    };

定义全局的Custom Deimiters:

    template <typename Delims>
    struct custom_delims
    {
        template <typename Container>
        custom_delims(const Container & c) : base(new custom_delims_wrapper<Container, Delims>(c)) { }

        std::unique_ptr<custom_delims_base> base;
    };

提供ostream <<输出方法:

    template <typename TChar, typename TCharTraits, typename Delims>
    inline std::basic_ostream<TChar, TCharTraits> & operator<<(std::basic_ostream<TChar, TCharTraits> & s, const custom_delims<Delims> & p)
    {
        return p.base->stream(s);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,273评论 19 139
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 9,496评论 1 10
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,170评论 25 709
  • 烈烈夏日,无甚心情。看诸事纷扰,不若静心,喝杯茶,读本书。不念过往,不怨当下,不忧未来,努力至无力,用心至尽心。
    乐者生存阅读 1,598评论 0 0
  • 在睡眼惺忪中醒来从美梦成真中亢奋揽来满怀清晨的香抛入情感深处酝酿 抓一把晨光洒向冲我微笑的花朵吸一口空气吹去无可预...
    草堂秋客阅读 1,724评论 0 3

友情链接更多精彩内容