折叠常量的C ++程序

时间:2017-05-14 06:32:53

标签: c++

我在C ++ 11中编写一个函数,它使用constant1 + constant2形式的表达式并将它们折叠起来。 constant1constant2存储在std::string中,其类型存储在enum TypeEnum中。

我的尝试如下:

计划

#include<iostream>
#include<assert.h>
#include<string>

using namespace std;

enum TypeEnum {
    INT, LONG_INT, LONG_LONG_INT,
    UNSIGNED_INT, UNSIGNED_LONG_INT, UNSIGNED_LONG_LONG_INT
};

long long fold(string constant1, string constant2, 
               TypeEnum typeConst1, TypeEnum typeConst2){

    if(typeConst1 == INT){
        if(typeConst2==INT)
            return stoi(constant1) + stoi(constant2);
        if(typeConst2 == LONG_INT)
            return stoi(constant1) + stol(constant2);
        if(typeConst2 == LONG_LONG_INT)
            return stoi(constant1) + stoll(constant2);
        if(typeConst2 == UNSIGNED_INT)
            return stoi(constant1) + stol(constant2);
        if(typeConst2 == UNSIGNED_LONG_INT)
            return stoi(constant1) + stoul(constant2);
        if(typeConst2 == UNSIGNED_LONG_LONG_INT)
            return stoi(constant1) + stoull(constant2);
    }else if(typeConst1 == LONG_INT){
        //...
    }else if(typeConst1 == LONG_LONG_INT){
        //...
    }else if(typeConst1 == UNSIGNED_INT){
        //...
    }else if(typeConst1 == UNSIGNED_LONG_INT){
        //...
    }else if(typeConst1 == UNSIGNED_LONG_LONG_INT){
        //...
    }

    assert(false);
}
int main(){
    cout << fold("1","9223372036854775806",INT,LONG_LONG_INT) << endl;
    cout << fold("1","2147483647",INT,INT) << endl; 
    return 0;
}

输出:

9223372036854775807

-2147483648

正如您所看到的,函数fold变得非常混乱和冗长。我想知道是否有更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:1)

使用switch{}构造:

switch(typeConst1){
case INT:
    switch(typeConst2){
    case INT:
        return stoi(constant1) + stoi(constant2);
    case LONG_INT:
        return stoi(constant1) + stol(constant2);
    case LONG_LONG_INT:
        return stoi(constant1) + stoll(constant2);
    case UNSIGNED_INT:
        return stoi(constant1) + stol(constant2);
    case UNSIGNED_LONG_INT:
        return stoi(constant1) + stoul(constant2);
    case UNSIGNED_LONG_LONG_INT:
        return stoi(constant1) + stoull(constant2);
case LONG_INT:
    //...

答案 1 :(得分:0)

我更愿意更改并简化问题,并按如下方式编写代码:

#include <iostream>

short int fold(short int a, short int b){return a+b;}  
int fold(int a, int b){return a+b;}

int main(int argc, char **argv){    
  std::cout<<fold((short)32767,(short)1)<<std::endl;
  std::cout<<fold(32767,(short)1)<<std::endl;   return 0; 
}

但正如您可能会注意到,如果将short更改为int并将int更改为long,则由于C ++的升级规则缺乏连续性,代码将不再起作用。