タグ

user defined literalに関するUSAGI-WRPのブックマーク (4)

  • 2012-10-15

    C++11では、ユーザー定義リテラルという、リテラル値に対して型付けするための機能が導入されました。C++11時点では、標準ライブラリでユーザーリテラルは使われてはいません。 C++1yでは、標準でいくつかのユーザー定義リテラルを提供する提案が出ています。 代表的なところでは、時間ライブラリのChronoがあります。このライブラリは、時間の間隔を表すseconds, millisecondsといった型が用意されているので、以下のようにして値を型付けできます: template <class Duration> void f(Duration d) {} seconds s(3); // 3秒 // 関数に渡す f(seconds(2)); // 2秒 f(milliseconds(3)); // 3ミリ秒 この提案では、std::suffixes::chrono名前空間に、Chronoライ

    2012-10-15
  • ユーザー定義リテラルの応用

    の虫: ユーザー定義リテラルのすべて の虫: ユーザー定義リテラル補足 先日、ユーザー定義リテラルについて全てを解説した。すでに、十分実験に耐えるコンパイラーもある。しかし、どうもユーザー定義リテラルは使われていない。そこで、ユーザー定義リテラルの活用法を考えて見ることにした。 自作クラスのリテラル まず最も簡単に思いつくのは、自作クラスのリテラルを作ることだ。たとえば、任意の精度の演算を実現する、架空の整数クラス、bigintを考える。 bigint x("10854312124826591996706630") ; bigint y("9809954364263402890285234523") ; bigint z = x + y ; 変数というのは素晴らしいものだが、やはり我々は、時には直接ハードコードした値を書きたいものである。これを従来の関数とユーザー定義リテラルで実現する

  • ユーザー定義リテラル補足

    前回、ユーザー定義リテラルのすべてを説明したつもりであったが、いくつか細かい漏れがあった。 まず、ユーザー定義リテラルの宣言であるが、実は文法上、空白文字が必要な箇所がある。""と識別子の間だ int operator "" /*ここに少なくともひとつの空白文字が必要*/ _identifier( unsigned long long int ) ; 空白文字を入れないと、""_identiferがひとつのトークンだとみなされてしまう。 もちろん、この宣言を参照する際にも、空白文字が必要である。 operator "" /*空白文字が必要*/ _identifer( 123ULL ) ; また、ユーザー定義リテラルのオーバーロードは、あらかじめ定められた仮引数リストやテンプレートしか使えないが、その他は、普通の関数と変わりないということである。もちろん、inlineやconstexprで宣

  • ユーザー定義リテラルのすべて

    C++11にはユーザー定義リテラルというものがある。私はこの機能が嫌いだ。しかし、どうやらgcc 4.7がある程度の実装を終えたらしい。日C++に詳しい男を自称する私としては、試さなくてはならない。そこで、この記事を書く。この記事を読めば、今日から君もユーザー定義リテラルをバリバリに使えるようになる。 まず、C++11では、非常に不思議な理由により、ユーザー定義リテラルは、演算子のオーバーロードという形で実装する。はて、リテラルにつくサフィックスは演算子なのだろうか。それはともかく、ユーザー定義リテラルの識別子には、一言注意が必要である。ユーザー定義リテラルの識別子は、必ずアンダースコアからはじめなければならない。 私が注意深く、「識別子」と書いているのには訳がある。ユーザー定義リテラルの識別子は、「名前」ではないからだ。この詳細を理解する必要はない。重要なことは、必ず「識別子」をアン

  • 1