循环遍历 chrono 中的所有月份

Nic*_*els 6 c++ c++11 c++-chrono

我需要在代码中迭代所有月份:

for (auto m = std::chrono::January; m <= std::chrono::December; m++)
  std::cout << std::format(std::locale { "pt_BR.UTF-8" }, "{:L%B}\n", m);
Run Code Online (Sandbox Code Playgroud)

但它恰好是一个无限循环,因为std::chrono::month增量具有模 12 + 1 行为。因此,当循环m变量达到December(12) 时,它会回绕到January(1)。

我尝试过std::views::iota

for (auto m : std::views::iota(std::chrono::January) | std::views::take(12))
  std::cout << std::format(std::locale { "pt_BR.UTF-8" }, "{:L%B}\n", m);
Run Code Online (Sandbox Code Playgroud)

std::chrono::month但由于不满足概念而无法编译std::weakly_incrementable

Nic*_*els 8

您可以使用无符号循环!

for (unsigned i = 1; i <= 12; i++)
  std::cout << std::format(std::locale { "pt_BR.UTF-8" }, "{:L%B}\n", 
                           std::chrono::month { i });
Run Code Online (Sandbox Code Playgroud)

如果您喜欢,您可以定义std::incrementable_traitsforstd::chrono::month来使用std::views::iota

namespace std {
  template <>
  struct incrementable_traits<std::chrono::month> 
    : incrementable_traits<unsigned> {};
}

for (auto m : std::views::iota(std::chrono::January) | std::views::take(12))
  std::cout << std::format(std::locale { "pt_BR.UTF-8" }, "{:L%B}\n", m);

Run Code Online (Sandbox Code Playgroud)

  • +1:你的“do {} while”示例是我有时使用的:https://github.com/HowardHinnant/date/blob/cc4685a21e4a4fdae707ad1233c61bbaff241f93/test/date_test/year_month_day.pass.cpp#L138-L156 (4认同)