• C++泛型编程学习:让我们习惯在底层用C++宏生成代码 (转)


    --程序设想----------------------------------------------------------------------
    //输入个数不等的 参数列表 到 JoinString 里,将每个参数转换成一个字符串,再将其串起来返回。

    string JoinString( 参数列表... )
    {
        转换;
        返回参数列表组合成的字符串;
    }

    --继续优化----------------------------------------------------------------------
    //使用模板可以省去不同的类型转换函数,但不同类型的T转换方法不同,又引入模板特化问题。

    template < typename T >
    string JoinString( const T& value )
    {
        返回结果;
    }

    --简单垫片----------------------------------------------------------------------
    //写这样的函数: string Desc( 类型 ){ 返回描述的字符串 } ,然后对不同的类型提供这个函数的重载。
    (PS:boost是一个优秀的C++程序库,它的主页是:http://www.boost.org

    #include <iostream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    string Desc( int a )
    {
        ostringstream ostr;
        ostr << a;
        return ostr.str();
    }
    
    string Desc( double dd )
    {
        ostringstream ostr;
        ostr << dd;
        return ostr.str();
    }
    
    void print( string str )
    {
        cout << str << endl;
    }
    
    void main()
    {
        print( Desc(100) );
        print( Desc(12.4) );
    }

    --我的垫片----------------------------------------------------------------------
    //基于boost::lexical_cast,它可以实现内置类型到字符串的转换。

    template < typename T >
    inline std::string GetString( const T& value )
    {
        std::string strResult;
        strResult = boost::lexical_cast< std::string >(value);
        return strResult;
    }
    
    #ifndef HERO_BUILD_NOT_WITH_OGRE
    template <>
    inline std::string GetString( const Ogre::Vector3& value )
    {
        std::ostringstream ostr;
        ostr << value;
        return ostr.str();
    }
    #endif

    --拼接函数----------------------------------------------------------------------
    //我们可能需要处理一个接受字符串的函数,
    //然后我们在模板函数中使用GetString<T>(value)获取模板参数的字符串值并传递给我们的真正的处理函数。

    template <typename T >
    class Join_Handler
    {
        public:
            typedef T            value_type;
            typedef T&           reference_type;
        public:
            Join_Handler( reference_type value ):m_objValue(value)
            {
            }
        public:
            template < typename T1 >
            inline T& SmartWrite( const T1& t1 )
            { 
                return m_objValue.SmartWirte<T1>( t1 );
            }
            private:
                reference_type m_objValue;
    };
    
    // 可以通过特化更多的Join_Handler来支持更多的PIPE。
    template <>
    class Join_Handler< std::string >
    {
        public:
            typedef std::string         value_type;
            typedef value_type&         reference_type;
        public:
            Join_Handler( reference_type str ) : m_strPipe(str)
            {
            }
        public:
            template < typename T1 >
            inline std::string& SmartWrite( const T1& t1 )
            {
                m_strPipe.append( Hero::GetString<T1>(t1) );
                return m_strPipe;
            }
        private:
            reference_type     m_strPipe;
    };

    参考文档:

    让我们习惯在底层用C++宏生成代码 (转)

    ------------------------------------------------------------------------
    未完,待续......
    ------------------------------------------------------------------------

  • 相关阅读:
    WeX5 苹果APP打包教程
    开源中国社区
    HBuilder-飞速编码的极客工具,手指爽,眼睛爽下载
    java用double和float进行小数计算精度不准确
    SQL Server 查询表的主键的两种方式
    JS代码压缩格式化在线地址
    解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的方法
    SQL跨数据库复制表数据
    ExtJs 扩展类CheckColumn的使用(事件触发)
    DM36x IPNC OSD显示中文 --- 基本数据准备篇
  • 原文地址:https://www.cnblogs.com/xuejianhui/p/2746074.html
Copyright © 2020-2023  润新知