読者です 読者をやめる 読者になる 読者になる

C++14 文字列オブジェクトリテラルと時間リテラル

C++

先日、「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)