繁体   English   中英

用文字对象(如javascript中)替换开关盒(在c ++中)

[英]Replace switch case (in c++) with literal object like in javascript

在javascript和其他许多编程语言中,有switch case

switch(n)
{
case 1:
  alert(1);
  break;
case 2:
  alert(2);
  break;
default:
  alert(3);
}

Javascript还可以使您缩短很多时间。

alert({1:1,2:2}[n]||3); // literal obj , i need this.

alert([1,2][n-1]||3); // array

在c ++中有类似的东西吗?

文字对象...

更高级的例子

var 
moveUp=function(){},
moveDown=function(){},
doNothing=function(){};

switch(txt)
{
case 'moveUp':
  moveUp();
  break;
case 'moveDown':
  moveDown();
  break;
default:
  doNothing();
}

我更喜欢:

window.moveUp=function(){}
window.moveDown=function(){}
window.doNothing=function(){}

window[txt]?window[txt]():window.doNothing();

要不就

window.moveUp=function(){}
window.moveDown=function(){}

!window[txt]||window[txt]();

window可以是任何其他(自定义或预定义)对象。

std::map对此非常有效。 您可以使用大括号表示法创建它:

std::map<int, int> m = { {1,1}, {2,2}, {3, 3} };

这使得以后易于使用:

f((std::map<int, int>{ {1,1}, {2,2}, {3,3} })[1]);

但是,根据您处理缺失键的需求,您可能需要为此编写一些帮助程序。

为了更接近第二个示例中的内容,请执行以下操作:

void f ();
void g ();

f((std::map<std::string, std::function<void(void)> { {"a", f}, {"b", g} })["a"]);

坦白地说,如果我是你,我将停止用C ++编写JS。 它们是两种具有不同实践和习惯用法的不同语言。 将“聪明的” JS单身人士换成C ++语法并不是一个好主意。

对JS不太熟悉,但是首先让我警告一下C ++被爱着,但并不是因为它的简洁性或友好的语法;)

我的猜测是,您可以尝试使用从键到可调用键的映射来实现类似于您想要的功能。 (如果我知道txt是您的密钥)

void functionFoo()
{ /* ... */ }
void functionBoo()
{ /* ... */ }

std::map<std::string, std::function<void()>> callableMap;
callableMap.insert(std::make_pair("first key", &functionFoo);
callableMap.insert(std::make_pair("second key", &functionBoo);
...
std::string key = "first key";
callableMap[key](); // invoke functionFoo

当然,您不限于不带任何参数且不返回任何值的callable。 这是您可以调用的类型: std::function<void()> ,您可以根据需要使其变得复杂。

对于连续值,可以用C ++编写类似的代码:

void print(int n)
{
    // Check that 0 <= n < 3.

    using T = int[3];
    std::cout << T{4, 9, 18}[n] << std::endl;
}

对于任意值,您可以使用其他答案建议的std::map ,尽管相应的构造可能是该容器的静态版本(标准库中不存在)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM