2009-06-07

ユーザー定義リテラルのRaison d'êtreがますます分からなくなってきた

リテラルオペレーターは、必ず名前空間の中で定義しなければならない。さらに、使う場合は、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: