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。
您可以使用无符号循环!
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)