【问题标题】:Is it possible to pass parameters into a function using a switch statement in c++?是否可以使用 c++ 中的 switch 语句将参数传递给函数?
【发布时间】:2020-09-16 09:32:34
【问题描述】:

有什么方法可以在 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
}

函数根据 a、b 或 c 是否处于活动状态返回 true 或 false。重要的是要注意 a、b 和 c 确实是常量,但函数本身将确定它们当前是否处于活动状态。我正在处理的问题是,当给函数提供要检查的键码时,当前是否按下了键。它看起来像这样:

if (isKeyPressed(Key::A)) {
  //code
}

这是否可能,或者它是否从根本上破坏了 switch 语句?

【问题讨论】:

  • 了解function() 实际做了什么、a/b/c 是什么以及您的实际目标是什么真的很有帮助。一系列ifs,每次调用具有不同输入的函数与switch调用函数1次是根本不同的。
  • function 能否为多个输入返回真值?如果是这样,应该执行每个匹配的块,还是只执行第一个?
  • @KarlKnechtel 该函数可以为多个输入返回 true,并且所有结果为 true 的情况都应运行。
  • 在这种情况下,您可能不会改进原始代码。您可以使用 for 循环重复运行该函数,但您希望对每个结果执行不同的操作,所以。
  • 实际上,我想您可以构建一个结构,将Key::A 等符号映射到函数,并遍历该结构以检查是否按下了键,然后调用相应的函数。不过,C++ 肯定不会像其他一些语言那样简单。

标签: c++ function if-statement switch-statement


【解决方案1】:

switch 不是这样使用的。它需要看起来更像这样:

switch (someValue)
{
case value1:
  function(a);
  break;
case value2:
  function(b);
  break;
case value3:
  function(c);
  break;
}

如果这不是您想要的,那么 ?: operator 可能对您有用,具体取决于您的实际输入内容,例如:

function( condition1 ? a : (condition2 ? b : c) );

或者,也许您尝试调用该函数 1 次并根据输入获得不同类型的输出,然后您可以进行测试?如果是这样,那么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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2015-10-10
    • 2013-01-16
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多