C++11ユーザ定義文字数

1838 ワード

ユーザー定義文字数
次の手順を見てみましょう.
#include 

long double operator"" _mm(long double x) { return x / 1000; }
long double operator"" _m(long double x)  { return x; }
long double operator"" _km(long double x) { return x * 1000; }

int main()
{
    std::cout << 1.0_mm << '
'; std::cout << 1.0_m << '
'; std::cout << 1.0_km << '
'; }

出力は次のとおりです.
0.001
1
1000

この新しい構文は、#include以降の3行のコードが、字面量オペレータliteral operatorと呼ばれるユーザー定義の新しいタイプのオペレータを定義していることを理解しやすい.この例では、この演算子は、例えば、1 mm=10−3 m、1 km=103 m、1 m=1 mの長さ単位を変換することができる.したがって、オペレータは各長さの単位が何メートルであるかを自動的に計算することができます.
この特性の試験を開始する前に,この字面量オペレータのパラメータの数とタイプの制限を理解すべきである.C++11規格によると、以下の署名のみが合法です.
char const*
unsigned long long
long double
char const*, std::size_t
wchar_t const*, std::size_t
char16_t const*, std::size_t
char32_t const*, std::size_t

最後の4つは、2番目のパラメータが文字列の長さとして自動的に推定されるため、文字列に役立ちます.例:
std::size_t operator"" _len(char const*, std::size_t l)
{
    return l;
}

int main()
{
    std::cout << "ABCDEFGH"_len << '
'; }

出力は8です.
上記の最初の署名は文字列と混同しないでください.元の字面量raw literalオペレータと呼ぶべきです.例:
char const* operator"" _r(char const* s)
{
    return s;
}

int main()
{
    std::cout << 12_r << '
'; }

出力値は12です.
字面量の戻り値は厳密に限定されていない.コンプライアンス・タイプの戻り値を完全に提供できます.例:
std::string operator"" _rs(char const* s)
{
    return 'x' + std::string(s) + 'y';
}

int main()
{
    std::cout << 5_rs << '
'; }

その出力はx 5 yであるべきである.
【転入先:https://www.devbean.net/2012/05/cpp11-literals/】