查询char是否是编译时的数字

时间:2014-04-05 14:31:35

标签: c++ character compile-time

我想在编译时检查给定的char是否为数字。特别是我需要实现以下函数原型:

template<char c>
constexpr bool IsDigit();

澄清:我不必使用自定义实现。如果std中已经存在内置方式,我更倾向于使用该方法。

1 个答案:

答案 0 :(得分:4)

这适用于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/
}