如何重载C++的转换符operator type?
定义了一个CDataObj类,这个类使用Set接口将数据类型(多数情况是POD)包装(或序列化)然后通过网络传递出去,接收时再使用Get接口得到具体的类型值。
Get我使用的是一个模板加set_buf的包装,但是Get接口却不太好设计,如果采用一系列GetInt, GetDouble, GetString...未免太过啰嗦,于是我采用了C++的转换操作符函数,并作为类的模板成员函数,这样客户代码就可以这样写,如果确定dataobj里是T,则 T val = dataobj;
但是在特化的时候却没有办法进行下去了,我不知道对这个特殊的成员函数如何进行模板特化!!!
比如对字符串形式的特化:
复制代码
主题代码如下:
复制代码
另外我发现如果转换为const T&在VC++ 2005上可以通过编译,可是到了GCC 4.4却不行了,这又是为何?
Get我使用的是一个模板加set_buf的包装,但是Get接口却不太好设计,如果采用一系列GetInt, GetDouble, GetString...未免太过啰嗦,于是我采用了C++的转换操作符函数,并作为类的模板成员函数,这样客户代码就可以这样写,如果确定dataobj里是T,则 T val = dataobj;
但是在特化的时候却没有办法进行下去了,我不知道对这个特殊的成员函数如何进行模板特化!!!
比如对字符串形式的特化:
- template <>
- operator const char* () const
- {
- return (const char*)buf_;
- }
- class CDataObj
- {
- public:
- CDataObj()
- {
- // 做一些初始化
- }
- CDataObj(const CDataObj&)
- {
- // 做一些拷贝
- }
- CDataObj& operator = (const CDataObj&)
- {
- // 赋值
- }
-
- // T应该是bitwise copy semantics
- template <typename T>
- void set_value(const T& val)
- {
- set_buf(&val, sizeof(val));
- }
-
- //
- // 错误的特化代码???
- //
- // template <>
- // void set_value<const char*>(const char* str)
- // {
- // set_buf(str, strlen(str)+1);
- // }
-
- template <typename T>
- operator T () const
- {
- //assert("data pointer is null!" && buf_);
- return (T)(*buf_);
- }
-
- //
- // 为什么下面这个用const T&就无法编译呢?
- //
- // template <typename T>
- // operator const T& () const
- // {
- // //assert("data pointer is null!" && buf_);
- // return (const T&)(*buf_);
- // }
-
- private:
- void set_buf(const void* dataptr, int size)
- {
- // 申请内存,拷贝值
- }
-
- char* buf_;
- int size_;
- };
-
- int test()
- {
- CDataObj obj;
- obj.set_value(100);
- int n = obj; // 转换
-
- CDataObj obj2;
- obj.set_value("Hello");
- const char*
- }
作者: 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;
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