Это не то, как используется switch
. Вместо этого он должен выглядеть примерно так:
switch (someValue)
{
case value1:
function(a);
break;
case value2:
function(b);
break;
case value3:
function(c);
break;
}
Если это не то, что вы ищете, тогда оператор ?:
может работать для вы, в зависимости от того, что на самом деле ваши входы, например:
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);