64,685
社区成员
发帖
与我相关
我的任务
分享
template< typename T >
struct str_traits;
template< >
struct str_traits< const char* >
{
typedef T1 type; //T1的类型视需求而定
};
template< >
struct str_traits< const wchar_t* >
{
typedef T2 type; //T2的类型视需求而定
};
............
template< >
struct str_traits< other type >
{
typedef Tn type; //Tn的类型视需求而定
};
template <typename T >
struct str_policy;
template < >
struct str_policy< T1 >
{
static T1 Init( .......... )
{
return ...........;
}
};
template < >
struct str_policy< T2 >
{
static T2 Init( .......... )
{
...........
return .........;
}
};
template< typename T,
template< typename > class traits = str_traits,
template< typename > class policy = str_policy
>
struct str_c
{
typedef typename traits< T >::type member_type;
static member_type s_body;
};
template< typename T >
typename str_c< T >::member_type str_c< T >::s_body = policy< member_type >::Init( ... );
Init的形参可以定制,甚至str_c内部的静态变量个数也可以定制。
#include <iostream>
#include <string>
using namespace std;
template <typename StrType>
struct str_traits;
template <>
struct str_traits<string>
{
static string format(const char* str)
{
return string(str);
}
};
template <>
struct str_traits<wstring>
{
static wstring format(const char* str)
{
const int MAX_LENGTH = 256;
wchar_t wstr[MAX_LENGTH];
// 转换多字节到宽字节,例如调用MultiByteToWideChar
return wstring(wstr);
}
};
template <typename StrType>
struct str_c
{
static StrType s_body;
};
template <typename StrType>
StrType str_c<StrType>::s_body = str_traits<StrType>::format("中国");
int main(int argc, char **argv)
{
cout << str_c<string>::s_body << endl;
return 0;
}
但是你能忍受如此麻烦的初始化方式吗?
我觉得,你需要编写一个脚本,专门读取string str_c<string>::s_body = "name"语句并生成wstring str_c<wstring>::s_body = L"name"。
template <typename _CharT>
struct str_c;
template <>
struct str_c<char>
{
typedef string string_type;
static string_type s_body;
};
str_c<char>::string_type str_c<char>::s_body = "中国";
template <>
struct str_c<wchar_t>
{
typedef wstring string_type;
static string_type s_body;
};
str_c<wchar_t>::string_type str_c<wchar_t>::s_body = L"你好";
先来一个声明,然后针对需要的类型特化,用其他类型特化时会编译报错。template<>
const wchar_t* str_c< const wchar_t* >::_sBody = L"name";
但更灵活、更具扩展性的做法是加一个traits和policy。