ライブラリ定義リテラル
概要
C++11でユーザ定義リテラル機能が追加され、独自のsaffixリテラル記号を定義できるようになった。 C++14ではこの機能を用いて標準ライブラリで定義されているchrono, 複素数(complex), 文字列(std::string)を使いやすくするためのリテラルが定義された。
ライブラリ定義のユーザ定義リテラルはインラインネームスペースを用いて定義されており、以下のようになる。
namespace std{
inline namespace literals{
inline namespace string_literals{
basic_string<char> operator "" s(const char *str, size_t len);
basic_string<wchar_t> operator "" s(const wchar_t *str, size_t len);
basic_string<char16_t> operator "" s(const char16_t *str, size_t len);
basic_string<char32_t> operator "" s(const char32_t *str, size_t len);
}
inline namespacce chrono
}}
リテラルは::でスコープ指定せずに名前解決出来る必要があるため、usingディレクティブを用いる必要がある。 上記で示した例の場合では、以下のどれかを使用する。
using namespace std
using namespace std::literals;
using namespace std::literals::string_literals;
以下にライブラリに追加されたユーザ定義リテラルの一覧を示す。
サフィックス | ネームスペース | 戻り値型 | 使用例 |
---|---|---|---|
s | string_literals | std::string | "abc"s |
s | string_literals | std::wstring | L"abc"s |
s | string_literals | std::u16string | u"abc"s |
s | string_literals | std::u32string | U"abc"s |
h | chrono_literals | std::chrono::hours | 12h |
min | chrono_literals | std::chrono::minutes | 12min |
s | chrono_literals | std::chrono::seconds | 12s |
ms | chrono_literals | std::chrono::milliseconds | 12ms |
us | chrono_literals | std::chrono::microseconds | 12us |
ns | chrono_literals | std::chrono::nanoseconds | 12ns |
il | complex_literals | std::complex |
-1.0il |
i | complex_literals | std::complex |
-1.0i |
if | complex_literals | std::complex |
-1.0if |