急求:有什么方法可以把同一变量名根据不同条件定义成不同的数据类型,ex:变量名s1,根据条件可以定义成int,double,char...

解决方案 »

  1.   

    那么具体怎么用#ifdef,我这样用的
                    CStringArray m_ParType;
    m_ParType.Add(0);
    m_ParType.Add(0);
    m_ParType.Add(1);
    int parcount =3;
    if(parcount =1)
       {
       int flag1=atoi(m_ParType.GetAt(0));
               #ifdef flag1
          char s1[1000];
               #elif  flag1
      int s1;
               #elif  flag1
      double s1;
       #else flag1
      BOOL s1;
               #endif
       }     
    报错:error C2065: 's1' : undeclared identifier
      

  2.   

    使用 变体型VARIANT 变量
      

  3.   

    template<typename T>
    void testmethod(T x)
    {
      cout << x;
    }
    testmethod(1);
    testmethod("222");
    testmethod(1.011f);
      

  4.   


    CString CVarInitTypePrtyPage::VarToStr(COleVariant vData)
    {
    CString strTmp;
    switch(vData.vt)
    {
    case VT_BOOL:
    if(vData.boolVal == VARIANT_FALSE)
    strTmp = _T("0");
    else
    strTmp = _T("1");
    break;
    case VT_I1:
    strTmp.Format("%d",vData.cVal);
    break;
    case VT_UI1:
    strTmp.Format("%u",vData.bVal);
    break;
    case VT_I2:
    strTmp.Format("%d",vData.iVal);
    break;
    case VT_UI2:
    strTmp.Format("%u",vData.uiVal);
    break;
    case VT_I4:
    strTmp.Format("%ld",vData.lVal);
    break;
    case VT_UI4:
    strTmp.Format("%lu",vData.ulVal);
    break;
    case VT_R4:
    strTmp.Format("%f",vData.fltVal);
    break;
    case VT_R8:
    strTmp.Format("%f",vData.dblVal);
    break;
    case VT_DATE:
    {
    COleDateTime dtTmp;
    dtTmp = vData;
    CString strTmp1;
    strTmp1 = "%04d-%02d-%02d %02d:%02d:%02d";
    strTmp.Format(strTmp1,
    dtTmp.GetYear(),
    dtTmp.GetMonth(),
    dtTmp.GetDay(),
    dtTmp.GetHour(),
    dtTmp.GetMinute(),
    dtTmp.GetSecond());
    }
    break;
    case VT_BSTR:
    strTmp = vData.bstrVal;
    break;
    default:
    strTmp = _T("???");
    }

    strTmp.TrimLeft();strTmp.TrimRight();
    return strTmp;
    }COleVariant vData = "abcd";//定符串// 2字节有符号整数
    vData.vt = VT_I2;
    vData.iVal = 123;
      

  5.   

    条件编译的用法:
    1
    #ifdef _XXXX
    ...程序段1...
    #else
    ...程序段2...
    #endif
      这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。
    2
    #ifndef _XXXX 
    ...程序段1... 
    #else 
    ...程序段2... 
    #endif
      这里使用了#ifndef,表示的是if not def。当然是和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)。
    3
    #if 常量 
    ...程序段1...
    #elif<常量表达式2> 
    ...程序段2...
    #elif<常量表达式3> 
    ...程序段3...
                    ...    ...
    #else
    ...程序段2...
    #endif 
      这里表示,如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。楼主可以采用第三种情况,给个示例:#define ABC 3
    main()
    {
    #if  ABC>0
    int a=1;
    printf("%d\n",a);
    #elif ABC<0
    int b=-1;
    printf("%d\n",b);
    #else
    int c=0;
    printf("%d\n",c);
    #endif
    }
    9楼采用模板,好方法,模板设计时有一个方面就是为了简化上面的编程.
      

  6.   

    VARIANT and VARIANTARG 果然好强大
    以前没怎么接触COM,10楼的方法没用过,飘过,学习...
      

  7.   

    真的要看你的程序是出于什么要求才会有这种考虑,具体实现,上面的几位都提到了,都是可以的1. 宏定义#ifdef 一般用于代码跨平台或者跨操作系统的条件编译,用于变量类型的条件编译很少
    2. VARIANT一般用于跨语言数据传递,如果你是在COM开发中遇到这种问题,可以考虑使用VARIANT,但是话说回来,如果是做COM开发,也就不太可能提出这种问题,COM里面自然都会使用到VARIANT到
    3. 模板template,我猜你的程序是出于对某个常用函数的不同参数类型考虑吧,我建议你采用这种方法,这是比较标准的处理方法,C#里面的泛型,C++里面的模板,都是专干这个的。
    4. 最后我向你推荐使用boost里面的any数据类型,any把所有数据类型大小通吃,包括你自定义的数据类型,具体怎么用,去看看boost使用指南
       比如说class a
    {
    protected:
      boost::any m_var;
    public:
      void setvalue(boost::any v){m_var=v;}
      boost::any getvalue(){return m_var;}
    }
    //how to use
    class a;
    a.setvalue(123);
    int v1 = boost::any_cast<int>(a.getvalue());
    a.setvalue("123");
    string v2 = boost::any_cast<string>(a.getvalue());
      

  8.   

    请问11楼2种条件很好办,如果是4重条件怎么进行条件编译,那个常量和常量表达式怎么设置
    我用的时候好像只能设置成>0或者<0两种