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>
の場合はil
、complex<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::literals
、std::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)