将开关大小写(在c++中)替换为javascript中的文字对象

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

本文关键字:javascript 文字 对象 替换 大小写 c++ 开关      更新时间:2023-09-26

在javascript&在许多其他编程语言中存在CCD_ 1。

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 oneliners移植到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

当然,您并不局限于不接受参数也不返回值的可调用函数。这是您的可调用类型: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,尽管相应的构造可能是该容器的静态版本(在标准库中不存在)。