如何重载C++的转换符operator type?

定义了一个CDataObj类,这个类使用Set接口将数据类型(多数情况是POD)包装(或序列化)然后通过网络传递出去,接收时再使用Get接口得到具体的类型值。
Get我使用的是一个模板加set_buf的包装,但是Get接口却不太好设计,如果采用一系列GetInt, GetDouble, GetString...未免太过啰嗦,于是我采用了C++的转换操作符函数,并作为类的模板成员函数,这样客户代码就可以这样写,如果确定dataobj里是T,则 T val = dataobj;
但是在特化的时候却没有办法进行下去了,我不知道对这个特殊的成员函数如何进行模板特化!!!

比如对字符串形式的特化:
  1. template <>
  2. operator const char* () const
  3. {
  4.     return (const char*)buf_;
  5. }
复制代码
主题代码如下:
  1. class CDataObj
  2. {
  3. public:
  4.     CDataObj()
  5.     {
  6.         // 做一些初始化
  7.     }
  8.     CDataObj(const CDataObj&)
  9.     {
  10.         // 做一些拷贝
  11.     }
  12.     CDataObj& operator = (const CDataObj&)
  13.     {
  14.         // 赋值
  15.     }
  16.    
  17.     // T应该是bitwise copy semantics
  18.     template <typename T>
  19.     void set_value(const T& val)
  20.     {
  21.         set_buf(&val, sizeof(val));
  22.     }

  23.     //
  24.     // 错误的特化代码???
  25.     //
  26.     // template <>
  27.     // void set_value<const char*>(const char* str)
  28.     // {
  29.     //     set_buf(str, strlen(str)+1);
  30.     // }
  31.    
  32.     template <typename T>
  33.     operator T () const
  34.     {
  35.         //assert("data pointer is null!" && buf_);
  36.         return (T)(*buf_);
  37.     }
  38.    
  39.     //
  40.     // 为什么下面这个用const T&就无法编译呢?
  41.     //
  42.     // template <typename T>
  43.     // operator const T& () const
  44.     // {
  45.     //     //assert("data pointer is null!" && buf_);
  46.     //     return (const T&)(*buf_);
  47.     // }
  48.    
  49. private:
  50.     void set_buf(const void* dataptr, int size)
  51.     {
  52.         // 申请内存,拷贝值
  53.     }

  54.     char*   buf_;
  55.     int     size_;
  56. };

  57. int test()
  58. {
  59.     CDataObj obj;
  60.     obj.set_value(100);
  61.     int n = obj;          // 转换

  62.     CDataObj obj2;
  63.     obj.set_value("Hello");
  64.     const char*
  65. }
复制代码
另外我发现如果转换为const T&在VC++ 2005上可以通过编译,可是到了GCC 4.4却不行了,这又是为何?

作者: ichenq   发布时间: 2011-06-16

第一个错误:
a. template<typename T> void CDataObj::set_value( const T& val )
    的char*应该是
    template<> void CDataObj::set_value<char*>( char* const& str )
    你好好想想吧
b. 类CDataObj只需要知道set_value是其成员就行了,所以再多的特化都应该在类外。类似于
class CDataObj
{
public:
        template<typename T> void set_value( const T& val );
};

template<typename T> void CDataObj::set_value( const T& val )
{
}
template<> void CDataObj::set_value<char*>( char* const& str )
{
}

2. operator T() const 和operator  const T&() const 是否能构成重载,在逻辑上肯定错误,但语法上是否正确我也不知道。一般而言应该是
operator T() 和 operator const T&() const;

作者: bruceteen   发布时间: 2011-06-16