meryngii.neta

今日も新たな"ネタ"を求めて。

配列引数の要素数を調べる

C++

配列を返す関数 - meryngii.neta 以前に配列を返す関数は参照を使えば作れることを紹介したのだが、同じように関数の配列引数の要素数も調べることができるらしい。 #include <iostream> void f(int a[]) { std::cout << (sizeof(a) / sizeof(int)); } int main() { in</iostream>…

ストリーム関連の命名はあまりにひどい

C++

C++の教科書で必ず最初に現れるcoutとかC++の入出力ライブラリはオーバーロードを駆使することで型安全を堅持している。これはStroustrup氏の自信作で、その内部はテンプレートによって汎用性の高い設計になっている。 しかし、ストリームに関するクラス・関…

volatileとコピー・代入

C++

C++でvolatile修飾された構造体はものすごく扱いにくい。 typedef struct { int x; } X; int main() { X n_1; volatile X v_1; /* コピー(代入ではない)*/ X n_2 = n_1; /* OK */ X n_3 = v_1; /* エラー */ volatile X v_2 = n_1; /* OK */ volatile X v_…

テンプレート名と継承元

C++

C++ではテンプレート名が型名になるという仕様があるのだが、 クラステンプレート名は型名 - meryngii.neta これはなぜか継承元の指定では使えないらしい。 template <class T> struct A { }; template <class T> struct B //: A<B> // 1, NG : A< B<T> > // 2, OK { typedef A< B<T> > </t></t></b></class></class>…

エスケープと一行コメント

C++

// 使用可能 int x; 場合によってxは使用できないかもしれない。 Shift-JISにおいて「能」は2バイト目が\(0x5C)なので「だめ文字」と呼ばれる。これらの文字は配慮の足りないプログラムからエスケープと見なされて文字化けなどの問題を起こす。 また一行コ…

mailing2009-02

最近忙しくて記事を書けませんでした。 どうやらmailing2009-02が出たみたいです。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/#mailing2009-02 N2814 Fixing freestandingにフリースタンディング環境についていろいろ書いてあります。C++0x…

配列を返す関数

C++

C言語では配列を返す関数を作ることができない。 int a[100]; int f()[100] // エラー:関数は配列を返せない { return a; } 本当は int[100] f() // エラー:構文エラー { return a; } と書きたいところだが、これはC言語の奇妙な文法に合致しない。 複雑な宣…

新年に

今年もよろしくお願いします。 2009年はC++0xが発行される予定です。はたして無事C++09になれるのでしょうか。 世間のニュースは不景気のことばかりです。でも私は人々が自由に通信できる現代はとても面白い時代だと思います。現代の負の側面ばかり見てもし…

書式もコンパイル時に解析するprintfもどき

この記事の内容は古くなっており、正式なC++11では動作しません。詳細は中3女子さんからのコメントをば。 C言語の普通のprintfについて知りたい人は、他を当たった方がいい。 C++0xのVariadic Templatesのおかげでprintfもどきを作るのが簡単になった。書式…

初期化順

C++

main関数に入る前の厄介なバグに出会った。調べていくうちに初期化順の問題だということが分かった。 グローバルなオブジェクトの動的初期化の順番が不定なのは私も知っている。D&Eの3.11.4.1ではcoutやcinが動的初期化に頼っていることによる問題点について…

C++0x FAQ

Stroustrup氏のサイトにC++0x FAQというものが掲載されていることに気づいた。 http://www.research.att.com/~bs/C++0xFAQ.html Suffix return type syntaxではdecltypeで戻り値を指定する場合の例にautoの案を紹介しているが、 template<class T, class U> auto mul(T x, U y)</class>…

get_money

ボーっとN2800を眺めていたら、moneyという単語が目に飛び込んできた。しかもget_moneyとは生々しい…。 27.6.4 Extended Manipulatorsでは通貨や時刻を入出力するためのマニピュレータについて定めている。ロケール絡みで通貨の文字列を処理するmoney_getと…

例の入門書の和訳が進行中らしい

C++

http://www.stroustrup.com/Programming/ Translations in progress: * Chinese (simplified) * German * Japanese * Korean * Polish * Russian 日本語が追加されている!これは楽しみ。

丸め指定された数値演算

mailing2008-12が来ました。 Directed Rounding Arithmetic Operationsという提案があるようです。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2811.pdf この提案の動機はC++0xで区間演算*1がサポートされることになったことです。C99からfe…

VC++用のstdint.h

C++

Visual C++ではC99で追加されたstdint.hが提供されていないが、それを補うものがあるのでメモ。 http://www.vector.co.jp/soft/win95/prog/se432866.html Boostにもある。こちらはもちろんC++限定だ。 http://www.kmonos.net/alang/boost/classes/cstdint.ht…

12/5

明日はいよいよ東京でC++WGアドホック会議がある。私は参加できないのだが、私の案も含めて会議の結果に期待したい。 あと、同じく明日参議院で国籍法の改正案が可決される見通しのようだ。2chではかなり話題になっているようで、あやしい法案なら作り直して…

constexprの再帰を認めるべき

C++0xではconstexprによってコンパイル時に扱える問題の範囲が広がります。例えば、コンパイル時に評価できるユーザ定義型(複素数型など)をROM領域に置くことができるようになります。 現状の仕様でconstexprで定義された関数は再帰ができません。コンパイ…

属性の使い道

C++0xの属性の使い道で思いついたものを適当に並べる。 pod nonpod PODの定義が複雑なので、ユーザが思っている方でなかったらエラーを出すとか。 クラスを作るときも指定するときも。 static_assert(is_pod::value);でもいいか。 restrict C++ではnoalias・…

fstreamのファイル名

std::fstreamがファイル名をマルチバイト文字列(const char*とconst std::string&)でしか受け取れない件についてです。 template <class charT, class traits=char_traits<charT> > class basic_fstream : public basic_iostream<charT,traits> { public: // ... explicit basic_fstream(const char* s, ios_base::open</chart,traits></class>…

template concept

Committee Draftへのコメント一覧 - Faith and Brave - C++で遊ぼう 私の意見(41.)もまとめて下さったようで感謝。 fstreamのファイル名がconst wchar_t*を取れないのも加えて欲しいです。 さて、読み進めていくと、14.の提案の最後に強烈なおまけがくっつい…

例の入門書の翻訳

C++

http://www.research.att.com/~bs/programming.html Translations: * Chinese translation under way. * German translation under way. * Korean translation under way. * Polish translation under way. * Russian translation under way. あれ?Japanese…

andLinuxが更新されない

Linux界隈のソフトウェアはとにかく更新が早いというイメージがあるのだが、andLinuxはなかなか更新される気配がない。 ということでcoLinuxのみをインストールしたりしたけれども、設定が恐ろしく面倒で諦めた。 思い切ってWindowsを捨ててLinuxに移行する…

andLinux上で日本語入力

http://d.hatena.ne.jp/CoolDriver/20080224/1203826457 export GTK_IM_MODULE="scim" scim -dfirefox &

Boost 1.37.0

出ました。 http://www.boost.org/users/news/version_1_37_0 新しいライブラリはProtoのみです。これから調べます。

asm

C++

C++規格はインラインアセンブラのためのasmキーワードがある。 しかし、VC++は__asm、GCCは__asm__など、微妙に違ったキーワードを使っている。 なかなかいい資料が見つからない。互換性の問題なのだろうか。

typedefのtypename

C++

このコードはVC++8.0でエラー(警告はC4346)になる。 template <typename T> class A { typedef std::vector<T>::iterator type; // エラー }; テンプレート引数が関わると、型メンバを指定するのにこんな風にtypenameが必要なときがある。 template <typename T> class A { typedef ty</typename></t></typename>…

静的メンバは面倒くさい

C++

クラステンプレート内で宣言した静的メンバも、普通のクラスと同様の定義をヘッダに書かないとならない。これを抜かすと大量のリンクエラーになってしまう。 template <class T> struct A { static T value; }; template <class T> T A<T>::value; // これ 整合性のために必要なの</t></class></class>…

メンバ関数テンプレートで

C++

メンバ関数テンプレートをテンプレートの中で使おうとすると、templateキーワードが必要なときがある。 #include <iostream> #include <boost/tuple/tuple.hpp> template <class T> class A { public: void f() { x.template get<0>(); // ここ } private: boost::tuple<int, double, char> x; }; int main() { A<float> a; a.f();</float></int,></class></boost/tuple/tuple.hpp></iostream>…

implicit_cast

C++

暗黙のキャストを明示的に行いたい場合がある。 http://groups.google.com/group/comp.lang.c++.moderated/browse_frm/thread/048fb906e8641f4c/ 例えば変換演算子を呼び出したいときなどは、 struct A { void f() { } }; struct B { operator A() { return …

クラステンプレート名は型名

C++

クラステンプレートの中で自分のテンプレートを使うとき、テンプレート引数を省略することができる。 私はつい数か月前までこの仕様を知らなかった。 template <class T> struct A { static void f(A<T>); static void g(A); }; 一つ目のfはAをテンプレートとして扱い、</t></class>…