先日、「C++14 std::complexの標準ユーザー定義リテラル」を書きました。
今回は、文字列オブジェクトリテラルと、時間リテラルを紹介します。
basic_stringリテラル
sサフィックスを付けた文字列リテラルは、basic_stringクラスのオブジェクトになります。
using namespace std::string_literals; std::string a = "hello"s; std::string b = u8"hello"s; // UTF-8のstd::stringリテラル
プレフィックスでLを付けるとwstring、uを付けるとu16string、Uを付けるとu32stringになります。
using namespace std::string_literals; std::wstring c = L"hello"s; std::u16string d = u"hello"s; std::u32string e = U"hello"s;
これらのリテラルは、
namespace std { inline namespace literals { inline namespace string_literals { string operator "" s(const char* str, size_t len); u16string operator "" s(const char16_t* str, size_t len); u32string operator "" s(const char32_t* str, size_t len); wstring operator "" s(const wchar_t* str, size_t len); }}}
前回の記事でも書きましたが、std::literals、std::literals::string_literals名前空間はinline namespaceとして定義されるので、その名前空間は透過的になります。以下のいずれかの方法でusingディレクティブして使用します。より内側の名前空間を使用するほど影響範囲が狭くなります。
using namespace std; using namespace std::literals; using namespace std::string_literals;
durationリテラル
C++11で導入された時間ユーティリティライブラリChronoにも、リテラルが付きます。
時、分、秒を表すには、以下のようにします。
using namespace std::chrono_literals; hours a = 15h; minutes b = 30min; seconds c = 20s;
これらは、
namespace std { inline namespace literals { inline namespace chrono_literals { constexpr chrono::hours operator"" h(unsigned long long); constexpr chrono::duration<unspecified , ratio<3600,1>> operator"" h(long double); constexpr chrono::minutes operator"" min(unsigned long long); constexpr chrono::duration<unspecified , ratio<60,1>> operator"" min(long double); constexpr chrono::seconds operator"" s(unsigned long long); constexpr chrono::duration<unspecified > operator"" s(long double); constexpr chrono::milliseconds operator"" ms(unsigned long long); constexpr chrono::duration<unspecified , milli> operator"" ms(long double); constexpr chrono::microseconds operator"" us(unsigned long long); constexpr chrono::duration<unspecified , micro> operator"" us(long double); constexpr chrono::nanoseconds operator"" ns(unsigned long long); constexpr chrono::duration<unspecified , nano> operator"" ns(long double); }}}
参照:
N3402 User-defined Literals for Standard Library Types
N3468 User-defined Literals for Standard Library Types (version 2)
N3531 User-defined Literals for Standard Library Types (version 3)
N3642 User-defined Literals for Standard Library Types (part 1 - version 4)