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++宏生成代码 (转)
------------------------------------------------------------------------
未完,待续......
------------------------------------------------------------------------
posted on 2012-10-30 12:04 xuejianhui 阅读(323) 评论(0) 编辑 收藏 举报