我有一个返回三个值的小函数。我使用
std::tuple
来方便返回多个值。
函数返回的内容由一个变量决定,如果该变量不为零,则返回一个元组,否则返回另一个元组。因为我使用 C++20,所以我只使用大括号 (
{}
) 来构建元组。
我认为使用三元语句是完美的,但以下不起作用:
#include <tuple>
using std::tuple;
double hue(double b, double g, double r, double d, double i);
tuple<double, double, double> HSL_pixel(double b, double g, double r, double i, double x, double z) {
double s = x + z;
double d = z - x;
double avg = s / 2;
return d ? {hue(b, g, r, d, i), d / (1 - abs(s - 1)), avg} : {0.0, 0.0, avg};
}
在 Visual Studio 2022 中,在第一个左大括号位置检测到错误,它显示:“需要一个表达式”。
更改为 if else 语句解决了问题:
tuple<double, double, double> HSL_pixel(double b, double g, double r, double i, double x, double z) {
double s = x + z;
double d = z - x;
double avg = s / 2;
if (d) {
return { hue(b, g, r, d, i), d / (1 - abs(s - 1)), avg };
}
else {
return { 0.0, 0.0, avg };
}
}
但我想使用三元。在这种情况下我该如何使用三元?
从语法上讲,您不能将 braced-init-list 与条件运算符一起使用。所以这只是格式不正确的:
int a = true ? 1 : {};
你必须这样写:
int b = true ? 1 : int{};
在你的例子中是:
cond ? tuple{a, b, c} : tuple{d, e, f}
而不是:
cond ? {a, b, c} : {d, e, f}
或者,如果您确实更喜欢使用 braced-init-list,那么您必须使用
if
/else
(或只是 if
)。那时只是一个风格选择。