Return单行启动的数组

Return an array which is iniated in a one liner

我想 return 我的自定义结构对象数组 timeInDay 行数越少越好,以便 return 我的时间表中的一天。

struct timeInDay[] getRingTimesForWeekDay(int day) {
  switch (day) {
    case MONDAY:    return { {7, 50} };
    case TUESDAY:   return { {7, 50} };
    case WEDNESDAY: return { {7, 20} };
    case THURSDAY:  return { {7, 50} };
    case FRIDAY:    return { {7, 50} };
    case SATURDAY:  return { {7, 50} };
    case SUNDAY:    return { {7, 50} };
  }
}
struct timeInDay {
  unsigned short hour;
  unsigned short minute;
};

现在它会产生错误,方法的 return 值:

error: decomposition declaration cannot be declared with type 'timeInDay'
 struct timeInDay[] getRingTimesForWeekDay(int day) {

如果有人能用尽可能少的行写下他们的做法,将不胜感激。

return 函数中的 c 数组不需要任何行,因为您不能 return 函数中的 c 数组。

您可以动态分配它和 return 指向第一个元素和大小的指针,但您最好远离它以支持 std::array:

#include <array>

struct timeInDay {
  unsigned short hour;
  unsigned short minute;
};

std::array<timeInDay,1> getRingTimesForWeekDay(int day) {
  switch (day) {
    case 1:    return { {7, 50} };
    default:   return { {7, 50} };
  }
}

但是,正如其他人已经提到的那样,该函数仅 return 一个元素,因此不清楚为什么您首先需要一个数组。

PS:如果数组的大小是动态的,使用std::vector

你的 getRingTimesForWeekDay 只是 returns 一个 timeInDay 结构对象。如果你想要一个 timeInDay 结构数组,你可以定义它:

[Demo]

    std::array<timeInDay, num_week_days> ringTimesForWeekDays{
        {{7, 50}, {7, 50}, {7, 20}, {7, 50}, {7, 50}, {7, 50}, {7, 50}}
    };

如果以后想通过代码重新生成数组的内容,可以保留getRingTimesForWeekDay函数,用它来填充数组:

[Demo]

    std::generate(std::begin(ringTimesForWeekDays), std::end(ringTimesForWeekDays),
        [d = DayOfWeek::MONDAY]() mutable {
            auto t{ getRingTimesForWeekDay(d) };
            d = static_cast<DayOfWeek>(static_cast<int>(d) + 1);
            return t;
        });

此外,您可以在编译时使用立即调用的 lambda 表达式的结果初始化数组:

[Demo]

    constexpr auto ringTimesForWeekDays{
        [](){
            std::array<timeInDay, num_week_days> result{};

            std::generate(std::begin(result), std::end(result), [d = DayOfWeek::MONDAY]() mutable {
                    auto t{ getRingTimesForWeekDay(d) };
                    d = static_cast<DayOfWeek>(static_cast<int>(d) + 1);
                    return t;
                });

            return result;
        }()
    };