C++

冷たい牛

C++

C++11から浮動小数点数を16進表記で入出力出るようになっているが、なぜか、C++のコード内で使うことが出来ない。 #include <iostream> using namespace std; int main() { double pi = 3.14; cout << hexfloat << pi << endl; // 16進表記で出力 // double dead = 0xc</iostream>…

C++14の数値リテラルの桁区切り

C++

久々にC++の話 http://d.hatena.ne.jp/faith_and_brave/20131007/1381128629 'で区切るのかよ。 エディターのシンタックスハイライトどうすんだ? この構文に対応できないエディタかなり多そう。 いやC++11のraw string literalにも対応できていないエディタ…

SFINAE関係ねぇ〜

C++

C++テンプレートテクニック を少しずつ読んでいるがおかしな記述発見。 Chapter5 p109より 配列をbegin()に渡した場合、テンプレートのインスタンス化によってbegin()の戻り値の型であるtypename Containter;;iteratorへの置き換えに失敗します。このとき、…

コンパイルできない。

C++

おや、VCってfor文の制御式で変数の宣言ができないのか。 class foo { public: foo(int){} operator bool() const { return false; } ~foo(){} }; int main() { for(;foo x=0;) ; return 0; } どうも、デストラクタをもっているとだめなようだ。誰かバグ報告…

funnyクラスを作ってみた。その2

C++

funnyの色々な使い方。 // メンバ関数を呼び出す。 template <class T,class U,class V,class W> class speak_type:public U { public: void speak() const { static_cast<const T*>(this)->data()->speak(); } struct interface { virtual void speak() const=0; }; }; class dog { public: void speak(</const></class>…

funnyクラスを作ってみた。その1

C++

boostのfunctionとanyを合わせたようなクラスを作ってみた。 対応コンパイラは、VCとGCCのみ。 variadic templatesの使用推奨。簡単な使用例。 #include <iostream> #include <cstdlib> #include "funny.h" int main() { funny<> x; x = 1; std::cout << (int)x << std::endl; x</cstdlib></iostream>…

friend宣言の仕方が分からない。

C++

VC、GCCの両者が受け付けるfriend宣言の仕方が分からない(T_T) template <class S, class T, template <class> class U> class baz { friend class U<S>::template bar<T>; // <== GCCはこれを受け付けてくれない。 template <class> friend class U<S>::bar; // こうするとVCが受け付けてくれない。 }; template <class S></class></s></class></t></s></class>…

依存名とtypename

C++

Faith and Brave - C++で遊ぼうより 規格準拠度が高いとされるComeauですら、この種のバグをもっているだよねぇ。 #include <iostream> struct foo_tag{}; struct bar_tag{}; struct foo { typedef foo_tag tag; }; struct bar { typedef bar_tag tag; }; template <class T>voi</class></iostream>…

制御式での変数の宣言

C++

if文やswitch文での制御式で変数を宣言するとき、()による初期化ができないことに今頃気づく。 if(int orz=3) // OK if(int orz(3)) // NG 規格が()による初期化を許していない理由が分からない。

配列の要素数を求めるのは意外と難しい

C++

C++で配列の要素数を求める方法は大きく分けて以下の二つの方法がよく知られている。 (a) #define SIZE(A) (sizeof(A)/sizeof(A[0])) (b) char (*sizehelper(T (&)[N]))[N] { return static_cast<char(*)[N]>(0); } #define SIZE(A) (sizeof(*sizehelper(A))) どちらの方</char(*)[n]>…

国際文字名

C++

C99 及び C++では、基本文字集合にない文字を、\uxxxx 又は \Uxxxxxxxxを使って表現できるが、 両者では、若干仕様が異なっている。 簡単なまとめ 識別子として使える文字の違い。 C++では、半角カナ、全角英文字が利用可。 ハングルの取り扱いが大きく異な…

C++0x最新 Working Draft 公開

C++

最新Draft N2798.pdf が公開された。 Concept導入により、ライブラリが、ほぼ総書換えになっている。まさか、ユーザー定義リテラルが規格に入るとは、思っていなかった。 これは、使いたくないなぁ。Attribute syntaxも入っているな。これ必要か? _Pragma()…

無名クラスの入れ子クラス

C++

無名クラスの入れ子クラスを、関数テンプレートの引数にすると、Comeauでは、コンパイルできない。 どうやら、invalidなコードのようだ。 class { public: class bar{} baz; } foo; template <typename T> void hoge(const T&) {} int main(int argc, char *argv[]) { ho</typename>…

C++0xのraw string literal が名前に反して『raw』でない。

C++

バックスラッシュだらけにならずに正規表現が書けるのは一見便利だが、 『raw』でない部分があるのが気に入らない。 raw string literalの中でも以下の3点の変換が行われる。 行末のバックスラッシュによる行連結 トライグラフ ユニコードエスケープ これら…

初心者のためのC++0x

C++

『C++0xは、初心者のための不可解なエラーメッセージを減らすための機能が追加されます。』 誰がこんなこと言い出したんだ? #include <vector> #include <bitset> using namespace std; int main() { vector<::bitset<0xe-1>> a; return 0; } 上記のコードは標準C++ではコンパイルできない(VC</::bitset<0xe-1></bitset></vector>…

コンパイル時多倍長演算ライブラリ

C++

誰か作っていないかな?ちょびっとだけ作ってみる。 const unsigned int BASE=100000; template <typename T, T V> struct value2type { typedef T type; static const type value=V; }; template<typename A, typename B, int LIM=-30> struct ADD { template <int J, bool = false> struct I { static const int value =( A::template I<J >:</j></int></typename></typename>…

Q&Aサイトにあった質問にここで密かに答える。

C++

http://okwave.jp/qa4126119.html template <typename T, T N> struct inttype { typedef T type; static const T value= N; }; template <std::size_t DIM> class Component { public: template <class ...ARGS> Component(ARGS... args) :Component(inttype<std::size_t, 0>(), args...){} template </std::size_t,></class></std::size_t></typename>

配列の添字付け演算子は可換だよ

C++

C/C++でプログラムを書いている人にはよく知られていて、改めてブログで取り上げる話題ではないと思う人もいるかもしれませんが、JIS規格に従うなら、添字付け演算子は可換ではありません。 X 3014 5.2.1/1 前の式は、“T へのポインタ”という型でなければな…

JIS規格の誤り

C++

ときどき、更新します。JIS C++ の誤りについて私が今までに見つけたもの。(訂正内容は私が適当に訳した)2.10/2 × (17.4.3及び1.2参照) ○ (17.4.3.1.2参照) 3.4.3.2/5 パラグラフの最後の文『otherwise (the declarations are from different namespaces), t…

ローカルな静的オブジェクトのデストラクタはまともに呼ばれるのか?

C++

ふと気になって、簡単なテストをしてみた。 #include <iostream> #include <cstdlib> struct foo { foo(int n):i(n){} ~foo(){ std::cout << "foo::~foo:" << i << std::endl; } private: int i; }; void bar(int i) { if(i) { static foo x(3); } static foo y(2); } void func</cstdlib></iostream>…

C++0x ドラフト n2588 斜め読み

C++

英語は苦手なので間違っているかもしれんが、ざっと目を通してみた。ラムダ式を<>で開始するするのは遂に諦めたらしい。 関数本体を(...)で記述する方法はなくなったみたい。 Objective-C++で、メッセージ式との区別は一応出来るのかな。 [ローカル変数名] (…

最新ドラフト

C++

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2588.pdfが公開された。 Lambda式 キタ━━━━(゚∀゚)━━━━ !!!!!

ラベル付きbreakが欲しい

他の多くの言語には、ラベル付きbreakがあるのに、C++にはない。 マクロで強引に実装してみた。 ついでに制御移行条件、制御移行前実行部も付けてみる。 #define CAT2(X,Y) X##Y #define XCAT(X,Y) X##Y #define CAT(X,Y) CAT2(X,Y) #define BRK CAT(BRK, __…

BEGIN/ENDブロック

昔、AWKにあるBEGIN/ENDブロックが、C++でも使えたら便利かもしれないと思って、 マクロで作ったことを思い出す。 脳内から発掘したものをここに晒しておく。 #define CAT(X,Y) CAT2(X,Y) #define CAT2(X,Y) X##Y #define BEGIN \ static class CAT(Begin_cl…

最新ドラフトN2521

C++

ドラフトが更新されている。 30章 スレッドライブラリの中身、31章 日付及び時間のためのライブラリが、 追加された以外大きな変化はなさそう。 また、N2510によるとラムダ式の文法がまた変わるみたい。 N2487 N2510 <> <.> <&> <&> <=> <+> つーか、キーワ…

型が定義されているか判定する

C++

cppll:13290「その型があるかどうか」の判定方法より 標準C++内(多分)でやる方法。判定できるだけで、実用性はほとんどないけどな。 http://okwave.jp/qa3450940.htmlにあるコードを少しだけいじった。 typedef int* TYPE; namespace hoge{ struct dummy_cla…

テンプレート定義の外部でのtypename、templateの使用

C++

http://d.hatena.ne.jp/faith_and_brave/20080128/1201510970のコメント欄に テンプレート定義の外部では、限定子としてのtemplateは使えないと書いたのだが、 C++0xでは書いてもいいのね。 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#3…

BCCを信じてはいけないよ

C++

http://d.hatena.ne.jp/wraith13/20080103/1199302530より BCCは #if ディレクティブで sizeof が使えるのか。すげぇ。 しかし、結論が激しく逆転している。 JIS X 3014 16.1 p4 マクロ展開及び defined 単項演算子によるすべての置換の実行後、残っているす…

使ってみる。

冗談半分とはいえ、SWITCHマクロを作ってしまったので、使ってみる。 FizzBuzz問題 for(int i =1; i <= 100; ++i) { SWITCH(i) { DEFAULT std::cout << i; break; COND(_%3==0) std::cout << "Fizz"; CONTINUE; COND(_%5==0) std::cout << "Buzz"; CONTINUE;…

続・SWITCH

2007/11/6のSWITCHマクロを無意味に機能強化 これを使えば、誰でもスパゲティプログラムが書ける(書いてどうする)。 俺はプリプロセスを通した後のコードを読めねぇ。 変更点 複数の条件にマッチさせるためのマクロ CONTINUE を追加 優先順序付きの条件マク…