随笔-4  评论-40  文章-117  trackbacks-0


大家都知道,return 用来在函数里返回,有两种形式:一是 直接用return; 或者省略,表示无返回值。二是 return expression; 返回一个值。
今天测试时我发现两种以前没注意的方式,也是正确的。


<1>.  
void FuncA()
{
    
return void();   //正确的,同:return;
}


<2>.
void FuncB()
{
    
return FuncA();//也可以,同: FuncA();
}



这两种特性在某些情况下,是很有用的。比如,我要写一个函数模板,以 任意的模板参数类型 T 为返回值。

template <typename T>
T FuncC()
{
    
return T();    //这里举例返回 T();
}


template 
<typename T>
T FuncD()
{
    
return FuncC<T>();
}


所以即使对于 返回值 为 void 的情况,FuncD<void>(); 也是适用的。
如果编译器不支持这种特性。那么当我们就得针对void返回类型进行特化,或者函数重载,示例代码如下:

//一般处理
template <typename T>
T FuncE()
{
    
return FuncC<T>();
}


//特化版本
template<>
void FuncE<void>()
{
    FuncC
<void>();
}


//或者进行重载亦可
void FuncE()
{
   FuncC
<void>();
}



void Test()
{
    FuncE
<int>();    //泛化版本
    FuncE<void>();   //特化版本
    FuncE();         //重载版本
}


FuncE函数没有参数,可以特化或者重载,但如果它还有其他模板参数的话,由于函数模板不支持部分特化,就只能使用重载模板函数了。


发现这种方式后,为我省了很多事,原来为了识别一个模板参数是否为void,我模拟stl 搞了个 templeate <typename T> Return_Type_Trait {},然后利用类模板的特化来专门定义一些类型,以到达识别返回类型的目的。现在看来,都是多余的。可以使用这个特性来实现。



posted on 2009-07-08 11:54 李阳 阅读(9280) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理