[英]Is it possible to pass parameters into a function using a switch statement in c++?
有什么方法可以使用 c++ 中的 switch 语句将参数传递给函数? 我想要实现的是将一系列 if 语句转换为一个 switch 语句。
作为一个例子,我想把这个:
if (function(a)) {
//code
}
if (function(b)) {
//code
}
if (function(c)) {
//code
}
进入这个:
switch (function(a/b/c)) {
case a:
//code
case b:
//code
case c:
//code
}
function 返回真或假,具体取决于 a、b 或 c 是否处于活动状态。 需要注意的是,a、b 和 c 确实是常量,但 function 本身将确定它们当前是否处于活动状态。 我正在处理的问题是当 function 被赋予要检查的键码时,当前是否按下了键。 它看起来像这样:
if (isKeyPressed(Key::A)) {
//code
}
这是可能的还是它从根本上破坏了 switch 语句?
这不是switch
的使用方式。 它需要看起来更像这样:
switch (someValue)
{
case value1:
function(a);
break;
case value2:
function(b);
break;
case value3:
function(c);
break;
}
如果这不是您想要的,那么?:
运算符可能适合您,具体取决于您的输入实际是什么,例如:
function( condition1 ? a : (condition2 ? b : c) );
或者,也许您正尝试调用 function 1 次并根据输入获得不同类型的 output,然后您可以进行测试? 如果是这样,那么std::variant
可能就是您要查找的内容,例如:
std::variant<a,b,c> function()
{
return ...;
}
auto v = function(input);
if (std::holds_alternative<a>(v)) {
//code
}
else if (std::holds_alternative<b>(v)) {
//code
}
else if (std::holds_alternative<c>(v)) {
//code
}
或者:
auto v = function(input);
switch (v.index()) {
case 0: // a
//code
break;
case 1: // b
//code
break;
case 2: // c
//code
break;
}
或者:
auto v = function(input);
std::visit([](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, a>) {
// code
}
else if constexpr (std::is_same_v<T, b>) {
// code
}
else if constexpr (std::is_same_v<T, c>) {
// code
}
}, v);
或者:
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
auto v = function(input);
std::visit(overloaded {
[](a arg) { /* code */ },
[](b arg) { /* code */ },
[](c arg) { /* code */ },
}, v);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.