(一)实现用字符串作为switch的case子句-创新互联

1.      问题:

成都创新互联是一家集网站建设,梁子湖企业网站建设,梁子湖品牌网站建设,网站定制,梁子湖网站建设报价,网络营销,网络优化,梁子湖网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

 实现用字符串作为switch语句的case子句。形如:

int  main(int argc, const char** argv){

        const char* strInput = argv[1];

        switch(strInput){

                  case  "first":

                           cout <<  "first... " << endl;

                           break;

                  case  "second":

                           cout <<  "second... " << endl;;

                           break;

                  case  "third":

                           ccout  << "third...  " << endl;

                           break;

                  default:

                           cout <<  "Default..." << endl;

        }

}

2.      基本思路

1、用hash函数,设置字符串的hash值,将字符串转换为1个整数;

2、利用c++11自定义文字常量的语法,定义一个constexpr函数,switch的case标签处调用这个constexpr函数。

3.      实现

1、定义一个hash函数,计算出字符串的hash值,将字符串转换为1个整数;

定义: hash_map<const char*, int> CharHash;

struct  CharLess : public binary_function<const char*, const char*, bool>

{

public:

   result_type operator()(const  first_argument_type& _Left, const second_argument_type& _Right)  const

   {

       return(stricmp(_Left, _Right) < 0  ? true : false);

   }

};

然而,无论输入任何字符串,都无法找到对应的整数值。因为输入的字符串是指针,和"a"或"b"字符串常量指针的大小是绝对不会相同。解决方法如下:

写一个仿函数CharLess,继承自仿函数基类binary_function。

int  main(int argc, const char** argv){

        if (argc <= 1)   cout << "input error ... "  << endl;

        const char* strInput = argv[1];

        hash_map<const char*, int,  hash_compare<const char*, CharLess> > CharHash;

        CharHash["first"] = 0;

        CharHash["second"] =  1;

        CharHash["third"] = 2;

        if(CharHash.find(strInput) ==  CharHash.end()){

                  cout << "input  error ... " << endl;

                  return 0;

        }

        int nVal = CharHash[strInput];

        switch(nVal){

                  case 0:

                           cout <<  "first... " << endl;

                           break;

                  case 1:

                           cout <<  "second..." << endl;

                           break;

                  case 2:

                           cout <<  "third..." << endl;

                           break;

                  default:

                           cout <<  "Default..." << endl;

        }

}

2、利用c++11自定义文字常量的语法,定义一个constexpr函数,switch的case标签处调用这个constexpr函数。

constexpr  hash_t hash_compile_time(char const* str, hash_t last_value = basis)

{

   return *str ? hash_compile_time(str+1,  (*str ^ last_value) * prime) : last_value;

}

可以写出这样的swich语句:

int main(int  argc, const char** argv)

{

if  (argc <= 1)

                  cout << "input  error ... " << endl;

        const char* str = argv[1];

   switch(hash_(str)){

   case  hash_compile_time("first"):

       cout << " first "  << endl;

       break;

   case hash_compile_time("second"):

       cout << " second "  << endl;

       break;

   case  hash_compile_time("third"):

       cout << " third "  << endl;

       break;

   default:

       cout << "Default..."  << endl;

   }

}


上面的语法还不够漂亮,利用自定义文字常量,重载一个operator如下:

constexpr  unsigned long long operator "" _hash(char const* p, size_t)

{

   return hash_compile_time(p);

}

int main(int  argc, const char** argv)

{

if  (argc <= 1)

                  cout << "input  error ... " << endl;

        const char* str = argv[1];

   switch(hash_(str)){

   case "first"_hash:

       cout << " first "  << endl;

       break;

   case " second"_hash:

       cout << " second "  << endl;

       break;

   case " third"_hash:

       cout << " third "  << endl;

       break;

   default:

       cout << "Default..."  << endl;

   }

}


  1. 4.      参考资料

http://blog.csdn.net/yozidream/article/details/22789147

http://blog.csdn.net/sdhongjun/article/details/4517325

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

本文题目:(一)实现用字符串作为switch的case子句-创新互联
本文地址:https://www.cdcxhl.com/article10/cejsdo.html

成都网站建设公司_创新互联,为您提供云服务器网站策划域名注册网站排名定制开发企业网站制作

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都做网站