Запрос, является ли символ цифрой во время компиляции


Я хочу проверить, является ли данный символ цифрой во время компиляции. В частности, мне нужна реализация следующего прототипа функции:

template<char c>
constexpr bool IsDigit();

Для уточнения: я не должен использовать пользовательскую реализацию. Если уже есть встроенный способ в std, я бы предпочел этот метод.

1 2

1 ответ:

Это должно работать для ASCII:

constexpr bool IsDigit(char c) { return c >= '0' && c <= '9'; }  // ASCII only

Если вам нужно сохранить прототип:

template<char C>
constexpr bool IsDigit() { return C >= '0' && C <= '9'; }  // ASCII only

Для поддержки wchar_t Вы можете попробовать что-то вроде:

constexpr bool IsDigit(wchar_t c)
{
  return (c >= L'0' && c <= L'9') ||
         (c >= L'\u0660' && c <= L'\u0669') ||  // Arabic-Indic
         (c >= L'\u06F0' && c <= L'\u06F9') ||  // Extended Arabic-Indic
         (c >= L'\u07C0' && c <= L'\u07C9') ||  // NKO
         (c >= L'\u0966' && c <= L'\u096F') ||  // Devanagari
         (c >= L'\u09E6' && c <= L'\u09EF') ||  // Bengali
         (c >= L'\u0A66' && c <= L'\u0A6F') ||  // Gurmukhi
         (c >= L'\u0AE6' && c <= L'\u0AEF') ||  // Gujarati
         (c >= L'\u0B66' && c <= L'\u0B6F') ||  // Oriya
         (c >= L'\u0BE6' && c <= L'\u0BEF') ||  // Tamil
         (c >= L'\u0C66' && c <= L'\u0C6F') ||  // Telugu
         (c >= L'\u0CE6' && c <= L'\u0CEF') ||  // Kannada
         (c >= L'\u0D66' && c <= L'\u0D6F') ||  // Malayalam
         (c >= L'\u0E50' && c <= L'\u0E59') ||  // Thai
         (c >= L'\u0ED0' && c <= L'\u0ED9') ||  // Lao
         (c >= L'\u0F20' && c <= L'\u0F29');    // Tibetan

  // Missing check for Myanmar, Khmer, Mongolian, Limbu, New Tai Lue,
  // Tai Tham Hora, Tai Tham Tham, Balinese, Sundanese, Lepcha, Ol Chiki,
  // Vai, Surashtra, Kayah, Javanese, Cham, Meetei Mayek, Osmanya, Brahmi,
  // Sora, Chakma, Sharada, Takri, Mathematical.
  // For codes see http://www.unicode.org/ucd/
}