C++20 在三元语句中返回元组

问题描述 投票:0回答:1

我有一个返回三个值的小函数。我使用

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 };
    }
}

但我想使用三元。在这种情况下我该如何使用三元?

c++ c++20 conditional-operator ternary stdtuple
1个回答
0
投票

从语法上讲,您不能将 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
)。那时只是一个风格选择。

© www.soinside.com 2019 - 2024. All rights reserved.