忍者ブログ

どっかのゆとりのチラシの裏

plasma_effectのメモ帳的ブログのようなsomething

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

VC++ in VS2015の機能 part02 ユーザー定義リテラル

「VS2015の記事を見てたはずだがいつの間にかconstexprの記事になっていた」という意見が出た。VC++固有の機能の記事なんて俺が書けるわけ無いだろ!!!!

2015年7月20日にVisual Studio 2015がリリースされた。当然VC++も新しくなったわけだがそのうち新しく追加された機能を出来る限り毎日記事にしようと思う。
本日はそのpart02、ユーザー定義リテラルだ。

ある型の一時変数を作るのにわざわざ関数を使いたくはないという時があったりなかったりする。例えば複素数値型など。

struct complex{
int re_,im_;
constexpr complex(int re=0, int im=0):re_(re),im_(im){}
complex(complex const&)=default;
complex(complex&&)=default;
~complex()=default;
};

int main(){
complex v = complex(0,2);//2iって書きたい
}



100uでunsigned int型の100を表すようにユーザー定義のリテラルを使いたい。
operator""でそのようなユーザー定義のリテラルを作ることができる。

struct complex{
int re_,im_;
constexpr complex(int re=0, int im=0):re_(re),im_(im){}
complex(complex const&)=default;
complex(complex&&)=default;
~complex()=default;
};

complex operator"" _i(unsigned long long int v){
return complex(0, v);
}

int main(){
complex v = 2_i;//complex(0, 2);
}



ユーザー定義リテラルにはいくつか成約がある。まず引数の型にはunsigned long long intやlong doubleといった一部の型しか使えない。

int operator"" _hoge(unsigned long long int v){//OK
return static_cast<int>(v);
}
int operator"" _piyo(int v){
return static_cast<int>(v);
}

int main(){}



また_(アンダーバー)から始まらないリテラルは予約されてるので使うと色んな人に怒られる。コンパイラにも怒られる。

int operator"" hoge(unsigned long long int v){
return static_cast<int>(v);
}//コンパイルは通るが警告が出る

int main(){}



あと規格的には""と_の間に空白文字(スペースなど)が必要…らしい。別にMSVCでもgccでもclangでもスペース入れなくても通るんだから気にする必要とかないんじゃないのかこれ

unsigned long long intの他に使える型を紹介する。まずはlong double

int operator"" _to_int(long double d){
return static_cast<int>(d);
}

int main(){
int v = 2.0_to_int;
}



char const*

#include<utility>
int operator"" _hoge(char const*, std::size_t s){
return s;
}

int main(){
int v = "test"_hoge;
}



あとはwchar_tとかそこら辺である。

ユーザー定義リテラルでは基本的にtemplateが使えない。ただしvariadic templateを使用できる唯一の例が存在する。

template<char... Cs>struct string_t{};
template<char... Cs>string_t<Cs...> operator"" _hage(){
return string_t<Cs...>{};
}

int main(){
auto x = 12345_hage;//string_t<'1', '2', '3', '4', '5'>
}




この場合引数は付けない。unsigned long long intのみに対応する。

参考
本の虫 ユーザー定義リテラルのすべて:http://cpplover.blogspot.jp/2012/02/blog-post_16.html
C++11の文法と機能(C++11: Syntax and Feature):http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#over.literal

余談
記事書いてて公開するボタン押したら勝手にレイアウト変えられててマジギレだしブログ変えたい
PR

コメント

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字

カレンダー

08 2017/09 10
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

フリーエリア

最新CM

[02/12 kariya_mitsuru]
[10/14 どっかの京大生o]
[10/04 どっかのZ会生y]
[07/31 どっかのZ会生y]
[07/31 GNR]

プロフィール

HN:
plasma_effect
性別:
非公開

バーコード

ブログ内検索

最古記事

(06/08)
(06/18)
(06/21)

P R