zoukankan      html  css  js  c++  java
  • 查找n个数字中的最大值

    闲来无事,试试用arg_list查找n个数字中的最大者. 又因为本人喜欢模板, 所以就早早的写了以下代码, 没有经过严格测试.

    /*******************************************************************************
    * 版权所有:
    * 模 块 名:
    * 文 件 名:template_max_value.cpp
    * 实现功能:取不定数目的数值中的最大值
    * 作    者:leaker
    * 版    本:V1.0
    * 日    期:2013.11.07
    * 联系方式:xiao13149920@foxmail.com
    ********************************************************************************/
    // template_max_value.cpp
    #include<stdarg.h>
    #include<iostream>
    using namespace std;
    
    template<typename T>
    struct trait_type;
    #if 0
    template<>
    struct trait_type<char>
    {
    	typedef char value_type;
    };
    
    template<>
    struct trait_type<unsigned char>
    {
    	typedef unsigned char value_type;
    };
    
    template<>
    struct trait_type<short>
    {
    	typedef short value_type;
    };
    
    template<>
    struct trait_type<unsigned short>
    {
    	typedef unsigned short value_type;
    };
    #endif
    template<>
    struct trait_type<int>
    {
    	typedef int value_type;
    };
    
    template<>
    struct trait_type<unsigned int>
    {
    	typedef unsigned int value_type;
    };
    
    template<>
    struct trait_type<long>
    {
    	typedef long value_type;
    };
    
    template<>
    struct trait_type<unsigned long>
    {
    	typedef unsigned long value_type;
    };
    
    template<>
    struct trait_type<long long>
    {
    	typedef long long value_type;
    };
    
    template<>
    struct trait_type<unsigned long long>
    {
    	typedef unsigned long long value_type;
    };
    #if 0
    template<>
    struct trait_type<float>
    {
    	typedef float value_type;
    };
    #endif
    template<>
    struct trait_type<double>
    {
    	typedef double value_type;
    };
    
    template <typename T>
    typename trait_type<T>::value_type GetMaxValue(int numarg, ...)
    {
    	va_list args;
    	va_start(args, numarg);
    	typedef typename trait_type<T>::value_type value_type;
    	value_type ret = va_arg(args, value_type);
    	while(--numarg)
    	{
    		value_type arg = va_arg(args, value_type);
    		(ret < arg) &&  (ret = arg);
    	}
    	va_end(args);
    
    	return ret;
    }
    
    int main()
    {
    	int a = 9;
    	int b = 19;
    	int c = 29;
    	int d = 39;
    
    	std::cout<<GetMaxValue<int>(12,c,d,1,2,3,4,5,6,7,8,9,static_cast<int>(199.990))<<std::endl; 
    	std::cout<<GetMaxValue<double>(10 ,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.9,199.990)<<std::endl;
    	std::cout<<GetMaxValue<unsigned int>(12,c,d,1,2,3,4,5,6,7,8,9,static_cast<unsigned int>(199.990))<<std::endl; 
    
    	return 0;
    }
    

      或者有人疑惑为什么对char/short/float的trait_type注释起来. 原因是因为

    When you call a function with a variable argument list (which is generally a bad idea in C++), then anyfloat expressions are automatically promoted (converted) to double, and any char (any of the three flavours) and short (two flavours) are promoted to int. Therefore, as the error message says, you cannot expect va_arg() to collect a float or a char type; you need to collect a double orint and coerce the result if necessary.

      不足之处, 对于调用GetMaxValue<T>时,请确定好数据类型,并且请保证所传的比较数字的数据类型与T保持一致.若是不一致,请先转换.

  • 相关阅读:
    JavaScript脚本语言特色时钟
    这个周末安排,
    市场营销书籍推荐
    比较好的管理类书籍推荐
    如何培养自己的领导力?或许你该看看这些书
    十本最畅销的市场营销书籍,你看过几本?
    如何提高情商?答案可能在《情商必读12篇》这本书里
    如何管理好员工?
    做销售要看哪些书?《销售管理必读12篇》了解下
    管理书籍推荐,你看过哪些呢?
  • 原文地址:https://www.cnblogs.com/xiao13149920yanyan/p/3412398.html
Copyright © 2011-2022 走看看