2010-06-28

ユーザー定義リテラルに負数を渡す方法はない

ユーザー定義リテラルに負数を渡す方法は存在しない。

void operator "" _x(unsigned long long value) { }

// call operator "" _x(100) ;
100_x ;

// call operator "" _x(100) ;
// then apply unary - operator to the result.
// since return type of operator "" _x is void
// it's ill-formed.
-100_x ;

なぜなら、+-という符号は、整数リテラルではなく、単項演算子だからだ。これは、浮動小数点数リテラルでも同じである。

では、どうしても負数を表現したい場合、どうすればいいか。文字列で渡すしかない。文字列ならば、いくらでも自分の好きな負数の表現方法を定義できる。

qi::repeat - Faith and Brave - C++で遊ぼうをみて、ユーザー定義リテラルを使えば、少しコードが読みやすくなるのではないかと思った。ただ、ユーザー定義リテラルは制限も厳しすぎるので、あまりたいしたことはできない。

例えば、n回リピートするというnという引数と、何をリピートするのかという引数を、同時に渡すことができない。もちろん、ユーザー定義文字列リテラルならば、どうとでも好きになるが、二つの引数を渡すのに文字列はそぐわない。

それに、ユーザー定義リテラルのは、コンパイル時に引数が決定していなければならないので、やはり、よほど限定的な上京でしか使えない。

たとえば、nはコンパイル時に決まるとして、operator "" _repeat_1から、operator "" _repeat_10あたりまでを定義して、別の関数によりnを表現して、引数として文字を取るなどすれば、コンパイル時にnと文字を決められる環境では、すこし便利になるかもしれない。

No comments:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.