C++模板 包含变长string的struct与二进制数组的相互转换

C++模板高手进 包含变长string的struct与二进制数组的相互转换
譬如以下一个应用场景
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++语言环境中 而且掉用方便 功能强大 .
个人观点