C++模板 包含变长string的struct与二进制数组的相互转换
C++模板高手进 包含变长string的struct与二进制数组的相互转换
譬如以下一个应用场景
以上代码支持任意基础类型或者由基础类型组成的struct与二进制数组的转换,支持定长数组类型等都没问题。
但假如想支持变长string呢?比如一个包含std::string的struct,想到的方案是用如下的结构代替std::string,
struct my_string
{
int mn_len;
char *mp_data;
};
但是有个问题,对于模板函数,我如何识别到用户传入的类型里包含string类型了呢?
无论用宏用模板或者随意什么方法,怎样才能比较优雅地实现这种需求,等高手指点,3Q!
------解决方案--------------------
模板要特例化,在实现一个
template <string>
bool get(const KEY &key, string &value, bool &b_valid)
------解决方案--------------------
去看boost库的永久化子库的源码。
实际上,你根本不需要实现这么一个如此智能的支撑库。
------解决方案--------------------
1. C++的方法 如下:
typedef struct
{
long M_LTYPE; //存储的数据类型
long M_LINLEN ; //长度
union
{
float m_f; //8
long m_l; //7
long m_lt; //9,10
double m_d; //14
char m_c; //2
char m_string[MAX_DATABUF_SIZE]; //1,3,字符串长度不能超过32个字符,
short m_sh; //5
unsigned short m_ulong;
};
}Prop_Datau;
使用C++的 union 类型 组成一个结构体 其中 M_LTYPE 的值 自己定义一些你需要的宏去标识你想标识的类型即可 在你需要而地方进行判断即可知道传入的类型 功能上都可以实现 细节有待你自己斟酌.
2. MFC不知道你用过没有 里边有RTTI原理 我觉得可以仿照这个原理做一个类似的东西 实现你上述的功能
当然原理可用 就是相关环境差别大些 我只是有一个初步的设想觉得可以实现 至于是不是真可以实现 有待楼主自己研究 .
这个方法的有点是 实现后 可以复用在任何C++语言环境中 而且掉用方便 功能强大 .
个人观点
譬如以下一个应用场景
- C/C++ code
template <class T> bool get(const KEY &key, T &value, bool &b_valid) { assert(NULL != mp_conn); KEYS keys; keys.push_back(key); mp_conn->get(keys); const result_manager &res = mp_conn->get_result(); const results_type &results = res.get_results(); b_valid = !results.empty(); if (b_valid) { const BYTES &bytes = results[0]; const int n_bytes_size = bytes.size(); if (sizeof(T) > n_bytes_size) { memcpy(&value, (char *)&(bytes[0]), n_bytes_size); memset((char *)&value + n_bytes_size, 0, sizeof(T) - n_bytes_size); } else { memcpy(&value, (char *)&(bytes[0]), sizeof(T)); } } return (!res.is_error()); }
以上代码支持任意基础类型或者由基础类型组成的struct与二进制数组的转换,支持定长数组类型等都没问题。
但假如想支持变长string呢?比如一个包含std::string的struct,想到的方案是用如下的结构代替std::string,
struct my_string
{
int mn_len;
char *mp_data;
};
但是有个问题,对于模板函数,我如何识别到用户传入的类型里包含string类型了呢?
无论用宏用模板或者随意什么方法,怎样才能比较优雅地实现这种需求,等高手指点,3Q!
------解决方案--------------------
模板要特例化,在实现一个
template <string>
bool get(const KEY &key, string &value, bool &b_valid)
------解决方案--------------------
去看boost库的永久化子库的源码。
实际上,你根本不需要实现这么一个如此智能的支撑库。
------解决方案--------------------
1. C++的方法 如下:
typedef struct
{
long M_LTYPE; //存储的数据类型
long M_LINLEN ; //长度
union
{
float m_f; //8
long m_l; //7
long m_lt; //9,10
double m_d; //14
char m_c; //2
char m_string[MAX_DATABUF_SIZE]; //1,3,字符串长度不能超过32个字符,
short m_sh; //5
unsigned short m_ulong;
};
}Prop_Datau;
使用C++的 union 类型 组成一个结构体 其中 M_LTYPE 的值 自己定义一些你需要的宏去标识你想标识的类型即可 在你需要而地方进行判断即可知道传入的类型 功能上都可以实现 细节有待你自己斟酌.
2. MFC不知道你用过没有 里边有RTTI原理 我觉得可以仿照这个原理做一个类似的东西 实现你上述的功能
当然原理可用 就是相关环境差别大些 我只是有一个初步的设想觉得可以实现 至于是不是真可以实现 有待楼主自己研究 .
这个方法的有点是 实现后 可以复用在任何C++语言环境中 而且掉用方便 功能强大 .
个人观点