2013-08-20 24 views
7

私はC++ 11を学んでおり、ユーザー定義のリテラルに興味があります。 私はそれを少し演奏することに決めました。C++ 11ユーザー定義のリテラル

int n = 1000_000_000; 

は、私はC++ 11でこの機能をシミュレートしてみました: 一部の言語では、このような構文を持っています。

inline constexpr unsigned long long operator "" _000 (unsigned long long n)noexcept 
{ 
     return n * 1000; 
} 

inline constexpr unsigned long long operator "" _000_000 (unsigned long long n)noexcept 
{ 
     return n * 1000*1000; 
} 

inline constexpr unsigned long long operator "" _000_000_000 (unsigned long long n)noexcept 
{ 
     return n * 1000*1000*1000; 
} 

int main(){ 
    constexpr auto i = 100_000; // instead of 100000 
    constexpr auto j = 23_000_000; // instead of 23000000; 
} 

しかし、一般的なケースのために、私はそれをシミュレートすることができませんでした、すなわち

自動general_case = 123_456_789。 //コンパイルできない

私の質問は、「C++ 11を使用して上記の一般的なケースをシミュレートできますか?」です。

+2

1_000_000で動作しますか?私は個人的にカスタムのユーザーリテラルとK M G(キロメガギガ)の文字を使用します。 – dtech

+0

1_000_000をコンパイルしました! –

+0

それで@ddriverのみの問題は、正確ではありません – aaronman

答えて

4

現在のところ、これはC++ 11言語のユーザー定義リテラルでは不可能です。ユーザー定義のリテラルは、パラメータの限定フォーマットをサポートしています。右側のパラメータ、連鎖をサポートしていないようです。また、0から始まる数字を実際の数字として表す問題もあります。だからそれは無駄だ。

現在のアプローチでは_000などがスタンドアロンリテラルとして定義されているため、コンパイラはスタンドアロンリテラルのみで動作します。 _のようなものではなく、000は残念ながら使用できるパラメータです。

ただし、代わりに文字の接尾辞を使用できます。

long long constexpr operator"" K (long double n) { 
    return n * 1000; 
} 
long long constexpr operator"" M (long double n) { 
    return n * 1000000; 
} 
long long constexpr operator"" G (long double n) { 
    return n * 1000000000; 
} 

そして:

:もう一度あなたが視覚的に表示することなく、多くのゼロを持っている...だからあなたのようなもののために行くことができますので、

0.05M == 50000; 
123.232K == 123232 
1.000000001G == 1000000001 

確かに、最後のケースは、ソートの、目的に反し

1.G + 1 == 1000000001 // much clearer 1 billion + 1 

リテラルでは実数が必要であり、整数で使用するだけの余分なリテラルを定義しない限り、整数では動作しないので、少し醜いことになります。次に、代わりに1Gを使用するだけです。

また、このアプローチでは、コンパイラの警告が表示される可能性があります。明らかに、C++グループは、「将来の使用」のためにアンダースコアが付いていないすべてのサフィックスを予約します。警告を消したい場合は、代わりに_K _Mと_Gを使用してください。

EDIT:010のような数字を含む無効な結果が生成されるため、イニシャライザリストソリューションが削除されました。これは、8進数として処理され、計算が煩雑になります。

+0

問題が末尾のゼロであるが、一般的な場合(例えば '123456789' - >' 123456.789K' - > '123.456789M' - >クリアされていない場合) –

+0

@LightnessRacesinOrbit - 私はそれがかなり無意味であることに同意しますが、リテラルが間違っているOPの例としてはまだ有用です。私は実際にRHSのパラメータと連鎖に期待していましたが、現状のリテラルはかなり初歩的なようです。 – dtech

関連する問題