我在C ++ 11中编写一个函数,它使用constant1 + constant2
形式的表达式并将它们折叠起来。 constant1
和constant2
存储在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
变得非常混乱和冗长。我想知道是否有更好的方法来做到这一点。
答案 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 ++的升级规则缺乏连续性,代码将不再起作用。