C ++ 11を導入するユーザ定義リテラル既存のリテラルに基づいて新たなリテラル構文(の導入を可能にするint
、hex
、string
、float
任意のタイプのリテラルプレゼンテーションを持つことができるであろうように)。
例:
// imaginary numbers
std::complex<long double> operator "" _i(long double d) // cooked form
{
return std::complex<long double>(0, d);
}
auto val = 3.14_i; // val = complex<long double>(0, 3.14)
// binary values
int operator "" _B(const char*); // raw form
int answer = 101010_B; // answer = 42
// std::string
std::string operator "" _s(const char* str, size_t /*length*/)
{
return std::string(str);
}
auto hi = "hello"_s + " world"; // + works, "hello"_s is a string not a pointer
// units
assert(1_kg == 2.2_lb); // give or take 0.00462262 pounds
一見、これはとてもクールに見えますが、サフィックス_AD
を付け_BC
て日付を作成しようと考えたときに、それが実際にどれほど適用可能か疑問に思っています。オペレーターの順序が原因で問題があることがわかりました。1974/01/06_AD
最初に1974/01
(プレーンint
s として)評価し、その後06_AD
(8月と9月は8 0
進数の理由でなしで記述する必要はない)だけを評価します。これは1974-1/6_AD
、演算子の評価順序が機能するように構文を整えることで回避できますが、扱いにくいです。
だから私の質問の結論はこれです、あなたはこの機能がそれ自体を正当化すると思いますか?C ++コードを読みやすくするために、他にどのようなリテラルを定義したいですか?
2011年6月の最終ドラフトに合わせて構文を更新
string operator "" _s(const char*s);"
解析に使用することはできません"hello"_s"
。これは文字列リテラルであり、追加のsize_t
パラメーターを持つオペレーターを探します。私は正しいですか?
uint16_t
その動作が実装依存である、類似したタイプとuwrap16
し、unum16
与えられたような振る舞いの実装に依存しないだろう、uwrap16 w=1; unum16 n=1;
表情をw-2
してn-2
生じるであろう(uwrap16)65535
と(int)-1
、それぞれ[ uint16_t
システム上の最初の結果生じるであろうint
16ビットであり、およびシステム上の第二はどこint
も大きいです]。私が見た最大の問題は、数値リテラルの処理でした。
sizeof
実装に依存する整数型を返すため、IDBが依然として避けられない場所がいくつかありますが、状況はそれよりもはるかに良くなる可能性があります。そのコンセプトについてどう思いますか?