繁体   English   中英

是否可以使用 c++ 中的 switch 语句将参数传递到 function 中?

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

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