fork download
  1.  
  2. #include <string>
  3. #include <type_traits>
  4. #include <vector>
  5.  
  6. template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
  7. class NumWords {
  8. public:
  9. /** Возвращает единицу измерения с правильным окончанием
  10. * например:
  11. * формы: день, дня, дней
  12. * 1 день, 2 дня, 5 дней
  13. * @param form1 1 форма (например, день)
  14. * @param form2 2 форма (например, дня)
  15. * @param form3 3 форма (например, дней)
  16. */
  17. NumWords(const std::string &form1, const std::string &form2, const std::string &form3)
  18. : forms{form1, form2, form3} {}
  19.  
  20. /** Возвращает единицу измерения с правильным окончанием
  21. * например:
  22. * формы: hour, hours
  23. * 1 hour, 2 hours, 5 hours
  24. * @param form1 1 форма (например, hour)
  25. * @param form2 2 форма (например, hours)
  26. */
  27. NumWords(const std::string &form1, const std::string &form2) : forms{form1, form2} {}
  28.  
  29. const std::string &operator[](T value) const {
  30. if (forms.size() == 2) {
  31. if ((value == 1) || (value < 0 && static_cast<typename std::make_signed<T>::type>(value) == -1)) {
  32. return forms[0];
  33. }
  34. return forms[1];
  35. }
  36. auto data_100 = std::abs(static_cast<int>(value % 100));
  37. if (data_100 > 10 && data_100 < 20) return forms[2];
  38. auto data = std::abs(static_cast<int>(value % 10));
  39. if (data >= 5) return forms[2];
  40. if (data >= 2) return forms[1];
  41. if (data == 0) return forms[2];
  42. return forms[0];
  43. }
  44.  
  45. private:
  46. const std::vector<std::string> forms;
  47. };
  48.  
  49. #include <iostream>
  50. int main()
  51. {
  52. NumWords<int> words("минута", "минуты", "минут");
  53. std::cout << 22 << words[22] << std::endl;
  54. std::cout << 12 << words[12] << std::endl;
  55.  
  56. }
  57.  
Success #stdin #stdout 0s 4328KB
stdin
Standard input is empty
stdout
22минуты
12минут