[英]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.