リテラルオペレーターは、必ず名前空間の中で定義しなければならない。さらに、使う場合は、using declarationするのが一般となるだろう。なぜなら、誰も以下のように書きたくはないからだ。
namespace foo { int operator "" _bar (char *) ; } void f() { auto x = foo::operator "" _bar("hello,world!") ; }
もはや、ユーザー定義リテラルである必然性がない。普通の関数でいい。そこで、以下のようにする。
void f() { using foo::operator "" _bar ; auto x = "hello,world!"_bar ; }
実際には、複数のリテラルオペレーターを使いたいだろうし、ライブラリ側で、一度にすべてのusing declarationをしてくれる、プリプロセッサのマクロを提供するのが一般的となるだろう。しかし、そこまでして使いたいだろうか。ユーザー定義リテラルの本来の面目は、わかりやすいシンタックスシュガーとなることではなかったのか。関数ではなく、リテラルとして自前のクラスの値が記述できれば、分かりやすいコードになるというものではなかったのか。それが、ユーザー定義リテラルを使うには、そのまさに使わんとするローカルスコープ内で、おまじないのようなusing declarationが必要とあっては、一体誰が能く使うというのだろう。
偉い人の考えることは分からない。
No comments:
Post a Comment