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
结构数组,你可以定义它:
std::array<timeInDay, num_week_days> ringTimesForWeekDays{
{{7, 50}, {7, 50}, {7, 20}, {7, 50}, {7, 50}, {7, 50}, {7, 50}}
};
如果以后想通过代码重新生成数组的内容,可以保留getRingTimesForWeekDay
函数,用它来填充数组:
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 表达式的结果初始化数组:
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;
}()
};
我想 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
结构数组,你可以定义它:
std::array<timeInDay, num_week_days> ringTimesForWeekDays{
{{7, 50}, {7, 50}, {7, 20}, {7, 50}, {7, 50}, {7, 50}, {7, 50}}
};
如果以后想通过代码重新生成数组的内容,可以保留getRingTimesForWeekDay
函数,用它来填充数组:
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 表达式的结果初始化数组:
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;
}()
};