雁过无痕

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::

看见别人的帖子,也做了下。
代码只支持内建类型。


 1#include <iostream>
 2
 3template<bool, typename T, typename F>
 4struct Select_type { typedef T R; };
 5
 6template<typename T, typename F>
 7struct Select_type<false, T, F> { typedef F R; };
 8
 9template<typename T, typename S> 
10struct Larger_type {
11  typedef typename Select_type<sizeof(T) >= sizeof(S), T, S>::R R;
12}
;
13
14template<typename T, typename S>
15typename Larger_type<T, S>::R min_value(T a, S b)
16{
17  return a < b ? a : b;
18}

19
20
21int main()
22{
23  int a = 2;
24  double b = 1.2;
25  std::cout << min_value(a, b) << " " << min_value(b, a) << "\n";
26}

27
28



浮点数与整型进行比较时,默认整型转为浮点数


template
<bool, typename T, typename F>
struct Select_type { typedef T R; };

template
<typename T, typename F>
struct Select_type<false, T, F> { typedef F R; };

template
<typename T> struct Type_rank
static const int rank = 0; };

template
<> struct Type_rank<float>
static const int rank = 21; };

template
<> struct Type_rank<double>
static const int rank = 22; };

template
<> struct Type_rank<long double>
static const int rank = 23; }

template
<typename T, typename S> 
struct Larger_type {
  
static const int fa = Type_rank<T>::rank;
  
static const int fb = Type_rank<S>::rank;
  
static const bool flag = fa > fb || (fa == fb && sizeof(T) >= sizeof(S));
  typedef typename Select_type
<flag, T, S>::R R;
}
;

template
<typename T> 
struct Larger_type<T, T> { typedef T R;};

template
<typename T, typename S>
typename Larger_type
<T, S>::R min_value(T a, S b)
{
  
return a < b ? a : b;
}

posted on 2011-03-31 23:31 flyinghearts 阅读(1360) 评论(5)  编辑 收藏 引用

评论

# re: 支持不同类型的 min 函数 2011-04-01 09:34 溪流
对内建类型来说,sizeof 谁大就转到谁,也不是最合理的
比如int->double,我认为应该可以转换;而float->long long呢?貌似应该不认为可转换吧  回复  更多评论
  

# re: 支持不同类型的 min 函数 2011-04-01 18:44 so
就是嘛,推导返回类型的为T和S两类型中“较小”的那个。之前以为溪流要做的目地是根据实参a和b来推导返回类型呢。  回复  更多评论
  

# re: 支持不同类型的 min 函数 2011-04-01 23:23 flyinghearts
@溪流

我采用:sizeof 谁大就转到谁,
是因为:对 long long 转 float 的情况, 转换很可能造成数据错误
(float无法表示所有的long数),写代码时,不应该允许这样的隐式转换。
应该显示的转为float。

另外,还假定了不允许 int和unsigned int等
有符号类型和相应的无符号类型进行比较
  回复  更多评论
  

# re: 支持不同类型的 min 函数 2011-04-02 09:40 溪流
@flyinghearts
是的,应该显式转换,但是我必须知道原始返回类型后,才能考虑如何转换得到的结果。当我写下min(1LL, 2.0f) 的时候,我该认为返回类型是什么呢?或者是你假定不允许写下min(1LL, 2.0f)?请注意,当写下“min(1LL, 2.0f)”的时候,我并不了解min内部做了什么,我只是认为在比较他们的大小,不会猜到min里面会进行类型转换,因此不会写成“min((float)1LL, 2.0f)”或者“min(1LL, (long long)2.0f)”。  回复  更多评论
  

# re: 支持不同类型的 min 函数 2011-04-09 23:54 flyinghearts
@溪流

两个数必须类型一致才能比较(不一 致时,要进行隐式转换)。
当 long long 和 float 进行比较时,C++默认是将long long转为float,因为
float能表示的数的范围更广,但这可能带来错误的结果,
比如说:
float f = 1 << 29;
long long k = (1<<29)+1;

因此,调用者有责任将它们先转为同一类型再进行比较,比如都转为:double。

我刚更新了代码。可以通过rank的值大小,加上特化,控制类型的转换。

  回复  更多评论
  


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