读书人

问一道清华大学C++的作业题…解决方法

发布时间: 2012-02-16 21:30:36 作者: rapoo

问一道清华大学C++的作业题……
如果想比较一个整型(int)和一个浮点型(double)的变量大小并以大的那个变量的参数类型返回其本身,能做到吗?请编写函数实现自己的想法

C/C++ code
template <typename t1,typename t2>double max(t1 a,t2 b){    return (a>b)?a:b;}


我写了一段模板类的代码,但是不知道如何返回 大的那个变量的参数类型,望各位高手赐教,谢谢!

[解决办法]
原因是:如果不考虑“类型标志”等奇技淫巧(估计出题人的目的肯定不是考你类型标志再加一个union或使用派生类等等动态方式),那么表达式的静态类型只有编译时才能确定,而变量的大小不到运行时是判断不出来的,因此无解。
[解决办法]
[code=C/C++][/code]
如果是在两个类型中选取一个固定的“大的”类型(如在int和double中选double),那么很简单,TypeTraits就可以了。

如果象楼主的要求那样,根据变量的大小来选取。那么运行时的最佳方案大概就是
http://www.ddj.com/cpp/184403774
中提供的那个了。虽然它没能解决全部问题,但至少是可控的(如果不适用,会有编译错误产生)。

当然对于这样的情况:
int a;
short int b;
extern Fun(int);
extern Fun(short int);
...
Fun(max(a, b)); // error! Don't know which overload to invoke!

你可能不得不写:
template<typename L, typename R>
// 假设两个Fun有同样的返回类型(或不需要使用它们),这里设为void,否则根据使用情况继续递归下去。
void Fun_Max(L a, R b)
{
if (a > b)
Fun(a);
else
Fun(b);
}

毕竟C++不是动态类型语言,没有这方面的支持。
[/code]

[解决办法]
vitin盖棺定论,目前最好的方案就是Andrei Alexandrescu提供的这个了
C/C++ code
template <class L, class R>class MinResult {    L& lhs_;    R& rhs_;public:    operator L&() { return lhs_ < rhs_ ? lhs_ : rhs_; }    operator R&() { return lhs_ < rhs_ ? lhs_ : rhs_; }    MinResult(L& lhs, R& rhs) : lhs_(lhs), rhs_(rhs) {}};template <class LR>class MinResult<LR, LR> {    LR& lhs_;    LR& rhs_;public:    operator LR() { return lhs_ < rhs_ ? lhs_ : rhs_; }    MinResult(LR& lhs, LR& rhs) : lhs_(lhs), rhs_(rhs) {}};template <class L, class R>MinResult min(L lhs, R rhs){    return MinResult(lhs, rhs);} 

读书人网 >C++

热点推荐