用javascript中的文字对象替换switch case(用c ++)

时间:2015-11-25 10:50:27

标签: javascript c++

在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可以是任何其他(自定义或预定义)对象。

3 个答案:

答案 0 :(得分:1)

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 oneliner用于C ++语法并不是一个好主意。

答案 1 :(得分:1)

对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()>,您可以根据需要使其变得复杂。

答案 2 :(得分:0)

对于连续值,您可以在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作为其他答案建议,但相应的构造可能是该容器的静态版本(标准库中不存在)。