C++14 std::complexの標準ユーザー定義リテラル

C++14には、標準ライブラリにユーザー定義リテラルがいくつか定義される予定です。今回は、複素数クラスであるstd::complexのユーザー定義リテラルを紹介します。


これは、以下のようにして使います。

using namespace std::complex_literals;
std::complex<double> c = 2.0i;

std::cout << c.real() << std::endl; // 0
std::cout << c.imag() << std::endl;// 2

複素数リテラルは、リテラル値として虚部の値をとります。実部の値は0です。
サフィックスiにするとcomplex<double>型オブジェクトが作られます。
complex<long double>の場合はilcomplex<float>の場合はifサフィックスにします。


std::complexクラスのユーザー定義リテラルは、<complex>ヘッダで以下のように定義されます。

namespace std {
inline namespace literals {
inline namespace complex_literals {

constexpr complex<long double> operator"" il(long double);
constexpr complex<long double> operator"" il(unsigned long long);
constexpr complex<double> operator"" i(long double);
constexpr complex<double> operator"" i(unsigned long long);
constexpr complex<float> operator"" if(long double);
constexpr complex<float> operator"" if(unsigned long long);

}}}

std::literalsstd::literals::complex_literals名前空間inline namespaceとして定義されるので、これらの名前空間は透過的になります。そのため、複素数リテラルを使う際は、以下のいずれかの方法で名前空間をusingディレクティブします。

using namespace std;
using namespace std::literals;
using namespace std::complex_literals;

より内側の名前空間を使うほど、影響範囲が狭くなります。


参照:
N3779 User-dened Literals for std::complex part 2 of UDL for Standard Library Types (version 5)